Registro de erros de JavaScript do lado do cliente no servidor [fechado]


97

Estou executando um site ASP.NET onde tenho problemas para encontrar alguns erros de JavaScript apenas com testes manuais.

Existe a possibilidade de capturar todos os erros de JavaScript no lado do cliente e registrá-los no servidor, ou seja, no EventLog (via Webservice ou algo parecido)?


O problema de não usarmos o UnitTesting de JavaScript é porque há muitas pessoas contribuindo para o Site / Conteúdo e estão usando JavaScript. O conteúdo não é nada com que nós (como desenvolvedores) devamos nos preocupar, mas há erros no código. Portanto, uma solução geral seria melhor.
MADMap

Eu suponho que você não quer dizer a contribuição do usuário médio (senão esse é o buraco XSS) ... mas ... você poderia isolar o JS deles em try / catch para que pelo menos não afete o seu próprio JS ... sem saber a dinâmica do site, não sei se isso vai ajudar ou não ...
Mike Stone

O conteúdo é de outras equipes na empresa, não de usuários, portanto, não é um risco à segurança
MADMap

O Bugsnag registrará automaticamente seus erros e os mostrará em um painel. Funciona para .NET e JS.
Don P

Respostas:


68

Você pode tentar configurar seu próprio manipulador para o evento onerror e usar XMLHttpRequest para informar ao servidor o que deu errado, no entanto, como não faz parte de nenhuma especificação, o suporte é um tanto instável .

Aqui está um exemplo de Uso de XMLHttpRequest para registrar erros de JavaScript :

window.onerror = function(msg, url, line)
{
  var req = new XMLHttpRequest();
  var params = "msg=" + encodeURIComponent(msg) + '&url=' + encodeURIComponent(url) + "&line=" + line;
  req.open("POST", "/scripts/logerror.php");
  req.send(params);
};

Acabei de lançar um controle de servidor que ajuda você a fazer isso em thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
Ele fará um loop infinito se travar no manipulador?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Sim. E pior, causará DoS ao endpoint do servidor se você cair em um loop de erro. Você deve adicionar uma função de limitação para evitar que um cliente acesse o servidor muito rápido. Aqui está um exemplo disso em {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner

Você também pode criptografar um token que inclui o ID do usuário, IP, uma pequena string aleatória (para evitar ataques de texto simples conhecido se seu algoritmo de criptografia for rápido, mas fraco) e um carimbo de data / hora e incluí-lo como uma variável JS na página. Isso pode ser enviado com o relatório de erro e verificado antes de permitir que seja anexado aos logs. Isso ajuda a provar a provável autenticidade da mensagem de erro e protege contra ataques DoS burros, mas ainda não o protegerá de tentativas de DoS mais sofisticadas da maneira que o controle de fluxo.
mormegil

Isso pode sobrecarregar seu servidor, por exemplo, se você obtiver um erro no setIntervalmétodo. Existem muitos serviços de relatório de erros JS disponíveis na web. Saída ErrLytics . Ele também fornece análises de todas as ações do usuário em seu site.
Vivek Marakana

28

Resposta curta: Sim, é possível.

Resposta mais longa: as pessoas já escreveram sobre como você pode (pelo menos parcialmente) resolver esse problema escrevendo seu próprio código. No entanto, observe que existem serviços por aí que parecem garantir que o código JS necessário funcione em muitos navegadores. Eu encontrei o seguinte:

Não posso falar por nenhum desses serviços porque ainda não os experimentei.


1
Registrado com muscula.com. O serviço parece muito interessante e fácil de integrar e usar. Há também a biblioteca JavaScript github.com/csnover/TraceKit que permite obter informações de exceção do cliente, mas você precisa desenvolver seu próprio mecanismo de loggin do lado do servidor. Eu me pergunto se o Google Analytics poderia ser usado para isso
Maksym Kozlenko

1
trackjs.com também, e rastreia o que o usuário e a rede estavam fazendo antes do erro.
Todd Gardner

Além da lista acima existe também, log4sure.com é gratuito e também possui monitoramento em tempo real dos logs. Você também pode criar sua tabela de registro personalizada
Bhavin


1
jsnlog.com é gratuito e de código aberto .
estomia

12

Acabei de implementar o log de erro do lado do servidor em erros de javascript em um projeto no trabalho. Há uma mistura de código legado e novo código usando jQuery .

Eu uso uma combinação window.onerrore envolvimento dos manipuladores de eventos jQuery e função onready com uma função de tratamento de erros (consulte: Rastreamento de erro de JavaScript: Por que window.onerror não é suficiente ).

  • window.onerror: captura todos os erros no IE (e a maioria dos erros no Firefox), mas não faz nada no Safari e Opera.
  • Manipuladores de eventos jQuery: detecta erros de eventos jQuery em todos os navegadores.
  • Função pronta do jQuery: captura erros de inicialização em todos os navegadores.

Depois de detectar o erro, adiciono algumas propriedades extras a ele (url, navegador, etc.) e, em seguida, envio-o de volta ao servidor usando uma chamada ajax.

No servidor, tenho uma pequena página que apenas pega os argumentos postados e os envia para nossa estrutura de registro normal do servidor.

Eu gostaria de abrir o código para isso (como um plugin jQuery). Se alguém estiver interessado me avise, ajudaria a convencer os patrões!


1
Alguma chance desse código ser disponibilizado?
Lucas,

Infelizmente não :( já que não trabalho mais para a empresa onde criei esse código. Mas tinha apenas cerca de 100 linhas de código e deve ser razoavelmente fácil de recriar a partir dos detalhes acima.
Karl


Eu tentei isso, mas manter o jquery na dependência é uma dor e janela. Oonerror é uma porcaria para código minificado e javascript que é servido via cdns
Ankur Agarwal



0

Se você quiser registrar os erros do lado do cliente de volta no servidor, terá que fazer algum tipo de processamento do servidor. A melhor aposta seria ter um serviço da web que você pudesse acessar via JavaScript (AJAX) e passar as informações do log de erros para ele.

Não resolve 100% o problema porque se o problema for com o servidor da web que hospeda o serviço da web, você está em apuros, sua outra opção seria enviar as informações por meio de uma página padrão por meio de uma string de consulta. Um método de fazer isso é por meio da geração dinâmica de tags de imagem (que são removidas), pois o navegador tentará carregar a origem de uma imagem. No entanto, ele contorna bem as chamadas JavaScript de domínio cruzado. Lembre-se de que você estará em apuros se alguém desligar as imagens;)



0

Você poderia potencialmente fazer uma chamada Ajax para o servidor a partir de um try / catch, mas isso é provavelmente o melhor que você pode fazer.

Posso sugerir um teste de unidade de JavaScript em vez disso? Possivelmente com JSUnit ?


O problema de não usarmos o UnitTesting de JavaScript é porque há muitas pessoas contribuindo com o Site / Conteúdo e estão usando JavaScript (mas não têm a menor ideia sobre isso!), Então uma solução geral seria melhor.
MADMap
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.