O RM TRACKLOG e o motor de logs do RM, ele disponibiliza informações sobre o sistema através de arquivos de texto com data e hora do evento, e mensagem criada de forma automática.
Portanto com o Tracklog, os logs são capazes de mostrar o que, quando e onde aconteceu um evento, além de indicar quem deu início a ele.
1.1 O TRACKLOG REGISTRA VARIOS NIVEIS(LEVEL) DE LOG
Ordem | Nível(Level) | Identificado no arquivo | Uso |
---|---|---|---|
0 | Verbose | [VRB] | Verbose é o nível mais ruidoso, raramente (ou nunca) habilitado para um aplicativo de produção. |
1 | Debug | [DBG] | Debug é usado para eventos internos do sistema que não são necessariamente observáveis de fora, mas são úteis para determinar como algo aconteceu. |
2 | Information | [INF] | Os eventos de informação descrevem coisas que acontecem no sistema que correspondem às suas responsabilidades e funções. Geralmente estas são as ações observáveis que o sistema pode realizar. |
3 | Warning | [WRN] | Quando o serviço está degradado, em perigo ou pode estar se comportando fora de seus parâmetros esperados, os eventos de nível de aviso são usados. |
4 | Error | [ERR] | Quando a funcionalidade não está disponível ou as expectativas são quebradas, um evento de Erro é usado. |
5 | Fatal | [FTL] | O nível mais crítico, os eventos fatais exigem atenção imediata. |
1.2 INFORMAÇÕES CONTIDAS NO ARQUIVO DE LOG
O arquivo de log e escrito conforme um template padrão(outputTemplate):
"{SourceContext}{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Legacy} [{Level:u3}] {Message:lj} ({EnvironmentName}|{EnvironmentUserName}) <{ThreadId}:{ThreadName}>[{ProcessId}:{ProcessName}] [{CallerFilePath} - ({CallerLineNumber}) - {CallerMemberName}] [{Module}, {Category}, {Funcionality}] {NewLine}{Exception}"
Propriedades do templete | Exemplo de dados logado | Descrição |
---|---|---|
{SourceContext} | RM.Lib.Monitoring.Tracklog.Test.LogUnitTest | Contexto onde encontra-se o log, geralmente o namespace da classe que esta usando o TrackLog. |
{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} | 2022-08-30 17:44:44.870 -03:00 | Data e hora do evento. |
{Legacy} | [LGC] | Registros do sistema antigo de log são identificado com a tag [LGC] |
[{Level:u3}] | [INF] | Level do evento. |
{Tenant} | shared-environment | Identifica o Tenant do evento, esse item é acoplado a mensagem. |
{Message:lj} | Information log test | Mensagem do evento. |
({EnvironmentName}|{EnvironmentUserName}) | (Production|BH01\carlos.almeida) | Nome do ambiente e do usuário. |
<{ThreadId}:{ThreadName}> | <13:Host> | ThreadId e ThreadName do evento. |
[{ProcessId}:{ProcessName}] | [36956:Host.exe] | ProcessId e ProcessName do evento. |
[{CallerFilePath} - ({CallerLineNumber}) - {CallerMemberName}] | [Lib\RM.Lib.Monitoring.Tracklog.TesteUnitario\LogUnitTest.cs - (114) - Should_Write_Info_Log] | Arquivo de onde foi registrado o evento de log com numero da linha da e método que o chamou. |
[{Module}, {Category}, {Funcionality}] | [RMLib, SmartClient, Configuracao] | Modulo categoria e funcionalidade do sistema onde o evento ocorreu. |
{NewLine}{Exception} | NullReferenceException: Write Error Log Exception ---> System.Exception: Should_Write_Error_Log | Warning, Error e Fatal é registrado e uma nova linha com a exceção |
Tracklog é configurado através de um arquivo json: appsettings.log.json que deve ficar dentro da pasta Bin do sistema, caso o arquivo não seja encontrado o sistema assume as configurações padrões.
O conteúdo do arquivo de configuração é divido em algumas sessões.
2.1 SESSÕES DO ARQUIVO DE CONFIGURAÇÃO
A principal é a sessão é a "Serilog", onde é informado como e sistema deve escrever o arquivo de log e os recursos que serão utilizados:
Sessão Principal | Subsesões | Pode ser alterado? | |
---|---|---|---|
Serilog | |||
Using | Não | Recursos usados pelo Serilog | |
Enrich | Não | Informações usadas para enriquecer os dados do log. | |
MinimumLevel | Sim | Nível mínimo que deve ser registrado. 0-Verbose, 1-Debug, 2 - Information, 3-Warning, 4-Error, 5-Fatal | |
Filter | Sim | Usa expressão para filtrar eventos que passam pelo pipeline Serilog - Opções de Name: ByExcluding ou ByIncludingOnly | |
WriteTo | Somente os argumentos na subseção Args da MapToFile | Define como e onde o log deve ser escrito e salvo. |
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "MapToFile",
"Args": {
Propriedade | Descrição | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
path | Caminho onde o arquivo de log vai ser salvo
| ||||||||||||||
restrictedToMinimumLevel | Somente mensagens de log deste nível acima são enviadas para este coletor.
| ||||||||||||||
formatProvider | Fornece informações de formatação específicas da cultura ou null. Padrão: Null | ||||||||||||||
outputTemplate | Um modelo de mensagem descrevendo o formato usado para gravar no coletor.
| ||||||||||||||
fileSizeLimitBytes | O tamanho máximo aproximado, em bytes, para o qual um arquivo de log poderá crescer. Para crescimento irrestrito, passe null.
| ||||||||||||||
buffered | Indica se a liberação para o arquivo de saída pode ser armazenada em buffer ou não.
| ||||||||||||||
shared | Permitir que o arquivo de log seja compartilhado por vários processos.
| ||||||||||||||
flushToDiskInterval | Se fornecido, uma limpeza completa do disco será executada periodicamente no intervalo especificado. Exemplo: flushToDiskInterval: "2.00:00:00"
| ||||||||||||||
rollingInterval | O intervalo no qual o registro será transferido para um novo arquivo.
| ||||||||||||||
rollOnFileSizeLimit | Se True, um novo arquivo será criado quando o limite de tamanho do arquivo for atingido.
| ||||||||||||||
retainedFileCountLimit | O número máximo de arquivos de log que serão retidos, incluindo o arquivo de log atual. Para retenção ilimitada, passe null.
| ||||||||||||||
encoding | Codificação de caracteres usada para escrever o arquivo de texto. Opções: UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, ASCII, Default
| ||||||||||||||
retainedFileTimeLimit | O tempo máximo após o término de um intervalo em que um arquivo de log contínuo será retido. Exemplo: retainedFileTimeLimit: "6.14:32:15"
|
"WriteTo": [
{
"Name": "Console",
"Args": {
Propriedade | Descrição |
---|---|
theme | Define um tema para ser usado ao escrever o log no console |
outputTemplate | Um modelo de mensagem descrevendo o formato usado para gravar no console. Padrão: {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Legacy} [{Level:u3}] {Message:lj} {EnvironmentUserName} {EnvironmentName}- <{ThreadId}>{NewLine}{ExceptionDetails} |
"WriteTo": [
{
"Name": "Seq",
"Args": {
Propriedade | Descrição |
---|---|
serverUrl | Define a url do servidor Seq. |
*O Seq é um servidor de pesquisa e análise em tempo real para dados de log de aplicativos estruturados.
2.2 ARQUIVO DE CONFIGURAÇÃO PADRÃO
{ "Serilog": { "Using": ["Serilog", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Process", "Serilog.Settings.Configuration", "Serilog.Sinks.Seq", "Serilog.Expressions", "RM.Lib.Monitoring.Tracklog"], "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId", "WithEnvironmentUserName", "WithEnvironmentName"], "MinimumLevel": "Verbose", "WriteTo": [ { "Name": "Seq", "Args": { "serverUrl": "http://localhost:5341" } }, { "Name": "Console", "Args": { "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Legacy} [{Level:u3}] {Message:lj} {EnvironmentUserName} {EnvironmentName}- <{ThreadId}>{NewLine}{ExceptionDetails}" } }, { "Name": "Async", "Args": { "configure": [ { "Name": "MapToFile", "Args": { "rollOnFileSizeLimit": true, "rollingInterval": "Day", "fileSizeLimitBytes": 1073741824, "retainedFileCountLimit": 31, "outputTemplate":"{SourceContext}{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} {Legacy} [{Level:u3}] {Message:lj} ({EnvironmentName}|{EnvironmentUserName}) <{ThreadId}:{ThreadName}>[{ProcessId}:{ProcessName}] [{CallerFilePath} - ({CallerLineNumber}) - {CallerMemberName}] [{Module}, {Category}, {Funcionality}] {NewLine}{Exception}" } } ] } } ] } } |
2.2 ARQUIVO DE CONFIGURAÇÃO EXPURGO DE ARQUIVOS
Exemplo excluir arquivos com mais de 7 dias.
{ "Serilog": { "Using": ["Serilog", "Serilog.Enrichers.Environment", "Serilog.Enrichers.Process", "Serilog.Settings.Configuration", "Serilog.Sinks.Seq", "Serilog.Expressions", "RM.Lib.Monitoring.Tracklog"], "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId", "WithEnvironmentUserName", "WithEnvironmentName"], "WriteTo": [ { "Name": "Async", "Args": { "configure": [ { "Name": "MapToFile", "Args": { "rollOnFileSizeLimit": "true", //Habilita um tamanho limite para o arquivo de log "fileSizeLimitBytes": "52428800", // Especifica o tamanho de cada arquivo de log "rollingInterval": "Day", //Criar um novo arquivo a cada dia "retainedFileCountLimit": "100", //Limite máximo de arquivos se ultrapassar esse valor o sistema exclui os mais antigos "retainedFileTimeLimit": "7.00:00:00", //Exclui arquivos com mais de 7 dias } } ] } } ] } } |