
no meu anteriorpublicar, falei sobre capturar todos os erros no Angular com um manipulador de erros global. Se você deseja manter os erros capturados, precisa implementar um mecanismo de log confiável. Hoje, quero explicar como habilitar o registro Angular em seus aplicativos comregistrador ngxpacote.
Índice
Importância do registro
Como desenvolvedor, você é responsável por cada linha de código que escreve. Se um bug surgir no aplicativo, você precisará identificar o problema e fornecer uma correção para ele.
Sem dúvida, isso é mais fácil falar do que fazer em um projeto do mundo real. Na maioria dos casos, pode levar horas (se não dias) para reproduzir o problema antes mesmo de corrigi-lo.
Quando implementado corretamente, o log pode salvar seu tempo tão* grande. O registro não apenas economizará horas de depuração a longo prazo, mas também lhe dará confiança sobre suas soluções.
Login básico em JavaScript
Login de baunilhaJavaScripté bem simples - basta usar oconsole
objeto como mostrado abaixo.
Idioma do código: JavaScript (javascript)
console.registro('log de informações');console.avisar('registro de aviso');
Embora muito simples, o log do console pode limitar o que você pode fazer com seus logs. Pense nisso, você adicionará declarações de log em todo o projeto.
E se…
- você deseja desabilitar o registro temporariamente
- habilitar log apenas na produção
- ignorar certos níveis de log
- enviar logs para o servidor
É possível implementar esses requisitos manualmente. Você pode fornecê-lo como um serviço em seu aplicativo Angular.
No entanto, questões de infraestrutura, como registro, são essenciais em qualquer aplicativo e você não deve realmente gastar seu tempo criando e mantendo esses recursos. A menos que haja políticas rígidas da empresa, você deve usar bibliotecas em vez de reinventar a roda.
Introdução ao ngx-logger
ngx-loggeré uma biblioteca de registro muito simples para aplicativos Angular.
Ele oferece os seguintes recursos:
- Impressão bonita para o console
- Ativar registro com base no nível especificado
- Controle o nível de log com base no ambiente atual
- Envie mensagens de log para o servidor via HTTP para registro centralizado
- Indica a localização do log e o número da linha
Começar a usar o ngx-logger é fácil, bastacriar um novo aplicativo Angulare puxe o pacote do npm:
Idioma do código: bash (bash)
npm instalar ngx-logger
Importe a biblioteca no módulo raiz, ou seja,app.module.ts
:
Idioma do código: TypeScript (texto datilografado)
importar{ LoggerModule, NgxLoggerLevel }de 'ngx-logger';
Finalmente, importeLoggerModule.forRoot
em seu módulo de aplicativo. Aqui é onde podemos configurar o logger:
Idioma do código: TypeScript (texto datilografado)
@NgModule({ imports: [ BrowserModule, HttpClientModule, LoggerModule.forRoot({ serverLoggingUrl:'http://localhost:68552/',// Substitua por SUA APInível: NgxLoggerLevel.TRACE, serverLogLevel: NgxLoggerLevel.ERROR, disableConsoleLogging:falso}) ], declarações: [AppComponent], bootstrap: [AppComponent]})exportar aulaAppModule { }
Com a configuração acima em vigor, podemos iniciar o log em qualquer lugar do aplicativo.
Idioma do código: TypeScript (texto datilografado)
exportar aulaComponente de aplicativo {construtor(privadoregistrador: NGXLogger) {esse.logger.debug("Mensagem de depuração");esse.logger.info("Mensagem de informação");esse.logger.log("Mensagem de registro padrão");esse.logger.warn("Mensagem de aviso");esse.logger.error("Mensagem de erro"); }}
Aqui estamos injetando o NGXLogger como dependência na classe do componente, nos dando acesso aoNGXLogger
instância.
Ao executar o aplicativo, você verá as mensagens de log no console do navegador.

Você notará que há erros relacionados ao log do lado do servidor. Isso porque dissemosngxlogger
para enviar erros para o servidor em/api/logs
ponto final. Como esse URL não existe, recebemos uma mensagem de erro.
Configuração de registro angular
Vamos dar uma olhada no objeto de configuração:
Idioma do código: TypeScript (texto datilografado)
LoggerModule.forRoot({ serverLoggingUrl:'http://localhost:68552/',// Substitua por SUA API,nível: NgxLoggerLevel.TRACE, serverLogLevel: NgxLoggerLevel.ERROR, disableConsoleLogging:falso})
níveldefine o nível mínimo de log no navegador. Os níveis disponíveis são: TRACE, DEBUG, INFO, LOG, WARN, ERROR, FATAL e OFF. Esses valores vêmNgxLoggerLevel
aula.
serverLoggingUrlé onde você fornece o caminho completo para o ponto final da API para fazer logon no servidor. Isso é opcional, se você não precisa que os logs sejam enviados para o servidor, exclua esta linha.
serverLogLeveldefine o nível mínimo de log para log do lado do servidor.
disableConsoleLoggingé um sinalizador que ajuda você a desligar completamente o log do console.
Logging específico do ambiente em Angular
Um requisito comum em um aplicativo do mundo real é o registro específico do ambiente. Isso significa simplesmente que você deseja configurar o log de maneira diferente, dependendo do ambiente em que o aplicativo está sendo executado.
Por exemplo, você pode querer registrar erros apenas no ambiente de produção, mantendo todos os níveis de log ativados no ambiente de desenvolvimento.
Para fazer isso, precisamos usar variáveis de ambiente do nosso aplicativo Angular.
vamos importarambiente
objeto emapp.component.ts
, que nos permite inicializar a configuração de log com detalhes específicos do ambiente.
Idioma do código: TypeScript (texto datilografado)
importar{ ambiente }de 'origem/ambientes/ambiente';@NgModule({ imports: [ BrowserModule, HttpClientModule, LoggerModule.forRoot({ serverLoggingUrl:`${environment.apiUrl}API/logs`, level:environment.logLevel, serverLogLevel: environment.serverLogLevel, disableConsoleLogging:falso}) ], declarações: [AppComponent], bootstrap: [AppComponent]})exportar aulaAppModule { }
Existem dois ambientes em um aplicativo Angular gerado por cli:desenvolvimento
eProdução
. Esses ambientes são definidos noAngular.json
arquivo e localizado emorigem
pasta do projeto.
A ideia é que a mesma variável exista em cada arquivo de ambiente, fornecendo diferentes valores correspondentes ao ambiente.
Vamos atualizar o ambiente de desenvolvimento:
Idioma do código: TypeScript (texto datilografado)
importar{NgxLoggerLevel}de 'ngx-logger';exportar constambiente = { produção:falso, apiUrl:'http://localhost:68552/',// Substitua pela API locallogLevel: NgxLoggerLevel.WARN, serverLogLevel: NgxLoggerLevel.OFF};
Ao executar o aplicativo comde servir
, a configuração do ambiente de desenvolvimento será usada: somente os logs de aviso e acima serão registrados no navegador. O log do lado do servidor está desativado, pois queremos apenas ver os erros no console durante o desenvolvimento.
Vamos também atualizar o ambiente de produção (environment.prod.ts):
Idioma do código: TypeScript (texto datilografado)
importar{NgxLoggerLevel}de 'ngx-logger';exportar constambiente = { produção:verdadeiro, apiUrl:'http://api.myservice.com/api/',// Substitua pela API remotalogLevel: NgxLoggerLevel.OFF, serverLogLevel: NgxLoggerLevel.ERROR};
Nossa configuração de produção afirma que não haverá registro de navegador e apenas erros serão registrados no servidor no URL da API especificado.
Você pode testar isso iniciando seu aplicativo no modo de produção viang serve --configuration=produção
.
Registrando no servidor
O login no Angular acontece dentro do navegador de cada usuário, que não podemos acessar. O envio de logs para o servidor nos permite armazená-los em algum lugar seguro, como arquivos de log ou até mesmo um banco de dados.
Acho que esse é o recurso mais útil dongx-logger
.
Para que esse recurso funcione, você precisa de uma API que exponha umPUBLICAR
endpoint para aceitar um objeto de log.
ngx-loggerPUBLICAR
s um objeto para cada mensagem de log do endpoint da API.
Por exemplo:
Idioma do código: JSON / JSON com comentários (json)
{"nível":5,"adicional": [],"mensagem":"Erro","carimbo de data/hora":2020-02-02T11:42:40.153Z,"nome do arquivo":"principal.js","número da linha":87,"colunaNúmero":26}
Certifique-se de importarHttpClientModule
e definir oserverLoggingUrl
corretamente.
Sua implementação de API irá variar dependendo da pilha do servidor. Aqui está um exemplo de endpoint paraAPI da Web do .NET Core
:
Idioma do código: C # (cs)
[HttpPost]públicoIActionResultPublicar([FromBody] LogDto dto){eramsg =$"MENSAGEM:{dto.Mensagem}- "+$"ARQUIVO:{dto.FileName}- "+$"NÍVEL:{dto.Level}- "+$"NÚMERO DE LINHA:{dto.LineNumber}- "+$"TIMEMP:{dto.Timestamp:F}"+$"USUÁRIO:{User.Identity.Name}"; _logger.LogError(msg);retornarOK();}
E aí está! Você pode conferir o código emGitHub.
Eu gostaria de saber como você realiza o login em seus aplicativos, deixe-me saber nos comentários.
Deixe um comentário
16 comentários
Até parece
Esses logs imprimem quando você faz um IPA, instala no iPhone e depois conecta via XCode? Estamos tendo problemas para fazer isso.
Esperança Esen
Infelizmente não, eu sugeriria algo comoInsights de aplicativos do Azure.
Mikec711
Então, questão de configuração (pode ter um escopo mais angular, mas) … um cliente liga e eu quero alterar o nível de log para esse cliente. Posso fazer com que o cliente exporte (unix) para seu próprio ambiente e pegue a partir daí? ou seja: eu quero que o cliente A vá depurar, mas quero que o resto do mundo fique em alerta. Obrigado
Terry J Davis
Acabei de baixar o aplicativo. Estou executando o Angular 9.
this.logger.debug não grava no console. Eu tenho que usar this.logger.warn em vez disso.
ambiente.ts:
exportar const ambiente = {
produção: falso,
nome: 'dev',
logLevel: NgxLoggerLevel.DEBUG,
serverLogLevel: NgxLoggerLevel.OFF
};
app.module.ts:
LoggerModule.forRoot({
nível: ambiente.logLevel,
serverLogLevel: ambiente.serverLogLevel,
disableConsoleLogging: falso
})
taufique
Olá Umut Esen,
Eu segui linha por linha tudo está funcionando para mim, mas minha preocupação é que eu quero enviar esses logs para o servidor do nó, por favor me ajude se possível.
bomba como
Como!! Eu blog com bastante frequência e eu realmente agradeço por suas informações. O artigo realmente despertou meu interesse.
Asad Naeem
Depois de seguir seu exemplo linha por linha. Encontrei esses erros no navegador. Estou usando Angular 9.
core.js:6185 ERRO NullInjectorError: R3InjectorError(AppModule)[NGXLogger -> NGXMapperService -> HttpBackend -> HttpBackend -> HttpBackend]:
NullInjectorError: Nenhum provedor para HttpBackend!
Elias
Estou aprendendo isso, qual foi a solução exata para superar esse NullInjectorError?
Esperança Esen
O NGXLogger requer um cliente Http para postar logs nas APIs, portanto, você precisa fornecer essa dependência em seu módulo raiz/núcleo.
Neeraj
Qualquer atualização, também estou enfrentando o mesmo problema, quero chamar meu interceptador, mas devido ao HttpBackend, ele está ignorando meu interceptador.
perdoar
Eu tentei com o npm `ngx-logger` mais recente e de alguma forma não estou recebendo um erro que
PUBLICARhttp://localhost:4200/api/logs/não encontrado.
Isso depende de uma versão específica?
Esperança Esen
Não, ainda está forte! No entanto, comecei a usar insights de aplicativos do Azure para registro automático!
gaurav
como podemos passar o payload do angular, você pode enviar o trecho de código, obrigado pela sua resposta
gaurav
nossa API é de get ou post ? minha api não está sendo chamada, você pode ajudar
Esperança Esen
Obrigado por seu comentário. Eu adicionei um exemplo de implementação da API POST na postagem.