Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

PropriedadeDescrição
enable

A propriedade "enable" tem como objetivo desabilitar o recurso de escrita de log em arquivo. Por padrão, o valor dessa propriedade é definido como "false", indicando que o recurso está desativado.

  • Padrão: false
path
Caminho onde o arquivo de log vai ser salvo
  • Padrão: <Diretório Raiz da aplicação>\\Logs

    Aviso
    titleAtenção

    O usuário do Sistema Operacional que está executando a aplicação precisa ter permissão de gravação no diretório especificado na propriedade "path".

Formato:

Os diretórios devem ser separados por duas barras invertidas \\ ou uma barra normal /
Exemplo:

"path": "C:\\TOTVS\\RM\\Logs\\" ✔️

"path": "C:/TOTVS/RM/Logs/" ✔️

"path": "C:\TOTVS\RM\Logs\" ❌

restrictedToMinimumLevelSomente mensagens de log deste nível ou acima deste nível serão enviadas para este coletor.
  • Padrão: Information
formatProviderFornece informações de formatação específicas da cultura ou null.

Padrão: Null

outputTemplateUm modelo de mensagem descrevendo o formato usado para gravar no coletor. 
  • O padrão é "{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}".
fileSizeLimitBytesO tamanho máximo aproximado, em bytes, para o qual um arquivo de log poderá crescer.
Para crescimento irrestrito, passe null.
  • O padrão é 1073741824 (1 GB). Para evitar escrever eventos parciais, o último evento dentro do limite
será escrito na íntegra mesmo que exceda o limite.
bufferedIndica se a liberação para o arquivo de saída pode ser armazenada em buffer ou não.
  • O padrão é False.
sharedPermitir que o arquivo de log seja compartilhado por vários processos.
  • O padrão é False.
flushToDiskInterval

Se fornecido, uma limpeza completa do disco será executada periodicamente no intervalo especificado.
Deve ser maior ou igual a 0.
Formato: d.hh:mm:ss
d : numero de dias.
hh: numero de horas.
mm: numero de minuto.
ss: numero de segundos.

Exemplo: 

flushToDiskInterval: "2.00:00:00"
A limpeza completa do disco será executada a cada dois dias.

  • O padrão é Null.
rollingInterval

O intervalo no qual o registro será transferido para um novo arquivo.

RollingInterval
InfiniteO arquivo de log nunca rolará; nenhuma informação de período de tempo será anexada ao nome do arquivo de log.
YearRole todos os anos. Os nomes dos arquivos terão um ano de quatro dígitos anexado no padrão yyyy.
MonthRole a cada mês do calendário. Os nomes dos arquivos terão yyyyMM anexado.
DayRole todos os dias. Os nomes dos arquivos terão yyyyMMdd anexado.
HourRole a cada hora. Os nomes dos arquivos terão yyyyMMddHH anexado.
MinuteRole a cada minuto. Os nomes dos arquivos terão yyyyMMddHHmm anexado.
  • O padrão é Null.
rollOnFileSizeLimit

Se True, um novo arquivo será criado quando o limite de tamanho do arquivo for atingido.
Nomes de arquivo  terá um número anexado no formato _NNN, com o primeiro nome de arquivo sem número.

  • O padrão é False.
retainedFileCountLimitO número máximo de arquivos de log que serão retidos,
incluindo o arquivo de log atual. Para retenção ilimitada, passe null.
  • O padrão é 31.
encodingCodificação de caracteres usada para escrever o arquivo de texto.
Opções: UTF8, UTF7, UTF32, Unicode, BigEndianUnicode, ASCII, Default
  • O padrão é UTF8
retainedFileTimeLimit

O tempo máximo após o término de um intervalo em que um arquivo de log contínuo será retido.
Deve ser maior ou igual a 0.
Ignorado se rollingInterval for Infinite.
Formato: d.hh:mm:ss
d : numero de dias.
hh: numero de horas.
mm: numero de minuto.
ss: numero de segundos.

Exemplo: 

retainedFileTimeLimit: "6.14:32:15"
O arquivo será retido depois de 6 dias 14 horas e 32 minutos e 15 segundos.
Caso o valor informado esteja em um formato invalido esse parâmetro será ignorado pelo sistema.

  • O padrão é Null.

...

Informações
iconfalse
titleDefinindo o path para especificar onde os arquivos de logs devem ser salvos
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": "Error",
		"WriteTo": [
			{
				"Name": "Async",
				"Args": {
					"configure": [
						{
							"Name": "MapToFile",
							"Args": {
								"enable": false, //para habilitar a escrita em arquivo altere esse valor para 'true'   
								"path": "C:\\TOTVS\\RM\\Logs\\",
								"rollingInterval": "Day",
								"fileSizeLimitBytes": "52428800",
								"rollOnFileSizeLimit": "true",
								"retainedFileCountLimit": "100",
								"retainedFileTimeLimit": "7.00:00:00", //Deletes files older than 7 days
								"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}"
							  }
						}
					]
				}
			}
		]
	}
}


Índice

01. VISÃO GERAL

O RM TRACKLOG é o motor de logs do RM responsável por disponibilizar informações sobre o sistema através de arquivos de texto contendo data e hora do evento e mensagens criadas 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 VÁRIOS NÍVEIS (LEVEL) DE LOG

...

1.2 INFORMAÇÕES CONTIDAS NO ARQUIVO DE LOG

O arquivo de log é escrito conforme um template padrão (outputTemplate):

Bloco de código
"{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}"

...

Contexto onde o log se encontra. Geralmente o namespace da classe que está usando o TrackLog.

...

02. COMO CONFIGURAR

O TRACKLOG é configurado através do arquivo JSON appsettings.log.json, o qual deve ficar no diretório raiz do sistema RM. 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, conforme detalhado a seguir. 

2.1 SESSÕES DO ARQUIVO DE CONFIGURAÇÃO

A a sessão principal do arquivo de configuração é a "Serilog", onde é informado como o sistema deve escrever o arquivo de log e os recursos que serão utilizados: 

  • Sessão principal Serilog

...

Sessão Principal

...

Subsesões 

...

  • Sessão que configura a escrita no arquivo de log

"WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "MapToFile",
              "Args": {

...

A propriedade "enable" tem como objetivo desabilitar o recurso de escrita de log em arquivo. Por padrão, o valor dessa propriedade é definido como "false", indicando que o recurso está desativado.

  • Padrão: false

...

Caminho onde o arquivo de log vai ser salvo
  • Padrão: <Diretório Raiz da aplicação>\\Logs

    Aviso
    titleAtenção

    O usuário do Sistema Operacional que está executando a aplicação precisa ter permissão de gravação no diretório especificado na propriedade "path".

Formato:

Os diretórios devem ser separados por duas barras invertidas \\ ou uma barra normal /
Exemplo:

"path": "C:\\TOTVS\\RM\\Logs\\" ✔️

"path": "C:/TOTVS/RM/Logs/" ✔️

"path": "C:\TOTVS\RM\Logs\" ❌

...

  • Padrão: Information

...

Padrão: Null

...

  • O padrão é "{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}".

...

  • O padrão é 1073741824 (1 GB). Para evitar escrever eventos parciais, o último evento dentro do limite

...

  • O padrão é False.

...

  • O padrão é False.

...

Se fornecido, uma limpeza completa do disco será executada periodicamente no intervalo especificado.
Deve ser maior ou igual a 0.
Formato: d.hh:mm:ss
d : numero de dias.
hh: numero de horas.
mm: numero de minuto.
ss: numero de segundos.

Exemplo: 

flushToDiskInterval: "2.00:00:00"
A limpeza completa do disco será executada a cada dois dias.

  • O padrão é Null.

...

O intervalo no qual o registro será transferido para um novo arquivo.

...

  • O padrão é Null.

...

Se True, um novo arquivo será criado quando o limite de tamanho do arquivo for atingido.
Nomes de arquivo  terá um número anexado no formato _NNN, com o primeiro nome de arquivo sem número.

  • O padrão é False.

...

  • O padrão é 31.

...

  • O padrão é UTF8

...

O tempo máximo após o término de um intervalo em que um arquivo de log contínuo será retido.
Deve ser maior ou igual a 0.
Ignorado se rollingInterval for Infinite.
Formato: d.hh:mm:ss
d : numero de dias.
hh: numero de horas.
mm: numero de minuto.
ss: numero de segundos.

Exemplo: 

retainedFileTimeLimit: "6.14:32:15"
O arquivo será retido depois de 6 dias 14 horas e 32 minutos e 15 segundos.
Caso o valor informado esteja em um formato invalido esse parâmetro será ignorado pelo sistema.

  • O padrão é Null.
  • Sessão que configura a escrita do log no console

"WriteTo": [
      {
          "Name": "Console",
          "Args": {

...

  • Sessão que configura o envio do log para o sistema de monitoramento Seq

"WriteTo": [
      {
        "Name": "Seq",
        "Args": {

...

*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

Informações
iconfalse
titleArquivo Padrão
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": "Information",
		"WriteTo": [
			{
				"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": {
								"enable": false, //para habilitar a escrita em arquivo altere esse valor para 'true'
								"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.3 ARQUIVO DE CONFIGURAÇÃO EXPURGO DE ARQUIVOS

Informações
iconfalse
titleExemplo excluir arquivos com mais de 7 dias
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": {
								"enable": false, //para habilitar a escrita em arquivo altere esse valor para 'true'                     
								"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 
							}
						}
					]
				}
			}
		]
	}
}

2.4 EXEMPLOS DE CONFIGURAÇÕES

2.4.1 Registrar log somente no console

Informações
iconfalse
titleRegistrar log somente no console
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": "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}"
				}
			}
		]
	}
}

2.4.2 Registrar log somente no Seq

Informações
iconfalse
titleRegistrar log somente no Seq
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": "Seq",
				"Args": {
					"serverUrl": "http://localhost:5341"
				}
			}
		]
	}
}

2.4.3 Registrar log somente no Arquivo, excluindo arquivos antigos a cada 7 após serem criados

Informações
iconfalse
title Registrar log somente no Arquivo, excluindo arquivos antigos a cada 7 dias após serem criados.
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": {
								"enable": false, //para habilitar a escrita em arquivo altere esse valor para 'true'                     
								"rollingInterval": "Day",
								"fileSizeLimitBytes": "52428800",
								"rollOnFileSizeLimit": "true",
								"retainedFileCountLimit": "100",
								"retainedFileTimeLimit": "7.00:00:00", //Deletes files older than 7 days
								"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.4.4 Registrar logs somente de erro ou superior no Arquivo, excluindo arquivos antigos a cada 7 dias após serem criados.

Informações
iconfalse
titleRegistrar logs somente de erro ou superior no Arquivo, excluindo arquivos antigos a cada 7 dias após serem criados.
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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": "Error", 
		"WriteTo": [
			{
				"Name": "Async",
				"Args": {
					"configure": [
						{
							"Name": "MapToFile",
							"Args": {
								"enable": false, //para habilitar a escrita em arquivo altere esse valor para 'true'    
								"rollingInterval": "Day",
								"fileSizeLimitBytes": "52428800",
								"rollOnFileSizeLimit": "true",
								"retainedFileCountLimit": "100",
								"retainedFileTimeLimit": "7.00:00:00", //Deletes files older than 7 days
								"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.4.5 Usando o recurso de Filter,  para refinar o log.

Informações
iconfalse
titleUtilizando a função de filtragem para obter registros específicos de um Tenant:
Bloco de código
languagejs
themeRDark
linenumberstrue
{
	"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",
		"Filter": [
		  {
			"Name": "ByIncludingOnly",
			"Args": {
			  "expression": "Tenant = 'CorporeRM'"
			}
		  }
		]
	}
}
Dica
titleLembre-se

Para usar o arquivo após o download, renomeie-o para appsettings.log.json e o coloque dentro do diretório raiz do sistema RM.

...