Logs - Rest PKI Core
O Rest PKI Core pode gravar logs nos seguintes destinos:
- Saída padrão (stdout)
- Arquivo
- Azure Table storage
O destino padrão depende da plataforma usada.
| Plataforma | Destino padrão dos logs |
|---|---|
| Linux | Saída padrão, que é registrada automaticamente no log do sistema (já que a aplicação é executada como daemon) |
| Docker | Saída padrão, o que em geral significa que os logs acabam nos logs do orquestrador |
| Azure | Azure Table |
Níveis
Os logs são classificados em um de 6 níveis de severidade:
| LogLevel | Descrição |
|---|---|
| Trace | Contém as mensagens mais detalhadas. Essas mensagens podem conter dados sensíveis da aplicação. Ficam desabilitadas por padrão e não devem ser habilitadas em produção. |
| Debug | Para depuração e desenvolvimento. Use com cautela em produção, por causa do grande volume. |
| Information | Acompanha o fluxo geral da aplicação. Pode ter valor a longo prazo. |
| Warning | Para eventos anormais ou inesperados. Em geral, inclui erros ou condições que não fazem a aplicação falhar. |
| Error | Para erros e exceções que não podem ser tratados. Essas mensagens indicam uma falha na operação ou requisição atual, não uma falha de toda a aplicação. |
| Critical | Para falhas que exigem atenção imediata. Exemplos: cenários de perda de dados, falta de espaço em disco. |
Por padrão, são registrados os logs com severidade Warning ou superior.
Isso pode ser alterado, por exemplo, para habilitar os logs com severidade Information ou superior:
[Logging:LogLevel]
Default=Information
Ou, com variáveis de ambiente:
Logging__LogLevel__Default=Information
Categorias
Os logs também são classificados em categorias, que podem ser usadas para habilitar logs com uma severidade mínima diferente conforme a categoria. Por exemplo, para habilitar logs
com severidade Debug ou superior apenas das categorias que começam com o prefixo Lacuna.RestPki (a relevância desse prefixo é explicada abaixo):
[Logging:LogLevel]
Lacuna.RestPki=Debug
Ou, com variáveis de ambiente:
Logging__LogLevel__Lacuna.RestPki=Debug
Abaixo estão alguns prefixos de categoria úteis.
| Prefixo da categoria | Descrição |
|---|---|
| Lacuna.RestPki | Logs gerados pela própria aplicação (e não por bibliotecas ou dependências externas) |
| Microsoft.EntityFrameworkCore | Todas as mensagens do Entity Framework Core (framework de acesso a dados usado pela aplicação) |
| Microsoft.EntityFrameworkCore.Database | Todas as interações com o banco de dados |
| Microsoft.AspNetCore.Hosting.Diagnostics | Requisições e respostas HTTP |
Habilitando o registro de dados sensíveis
Por padrão, dados sensíveis, como o conteúdo das requisições HTTP ou os parâmetros dos comandos SQL, não são registrados no log, independentemente do nível mínimo de severidade configurado. Para habilitar o registro de dados sensíveis:
[General]
EnableSensitiveDataLogging=True
Ou, com variáveis de ambiente:
General__EnableSensitiveDataLogging=True
Formatação JSON / logs estruturados
O Rest PKI Core gera logs estruturados. No entanto, por padrão, os logs são gravados na saída padrão em um formato legível por humanos, que "achata" as informações em uma única string, perdendo a estrutura que, de outra forma, estaria disponível.
Para evitar essa perda de dados, habilite a formatação JSON nos logs gravados na saída padrão:
[Logging:Console]
FormatterName=json
Ou, com variáveis de ambiente:
Logging__Console__FormatterName=json
Gravando logs em arquivo
Para gravar os logs em um arquivo, configure a aplicação da seguinte forma:
[Serilog:WriteTo:0]
Name=File
[Serilog:WriteTo:0:Args]
path=PATH_TO_LOG_FILE
outputTemplate={Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}
Ou, com variáveis de ambiente:
Serilog__WriteTo__0__Name=File
Serilog__WriteTo__0__Args__path=PATH_TO_LOG_FILE
Serilog__WriteTo__0__Args__outputTemplate={Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}
Para mais informações sobre a configuração outputTemplate, consulte Formatting Output.
Observe que, ao gravar logs em arquivo, a configuração do nível mínimo de severidade é diferente:
[Serilog:MinimumLevel]
Default=Error
[Serilog:MinimumLevel:Override]
Lacuna.RestPki=Information
Microsoft.EntityFrameworkCore.Database=Debug
Serilog__MinimumLevel__Default=Error
Serilog__MinimumLevel__Override__Lacuna.RestPki=Information
Serilog__MinimumLevel__Override__Microsoft.EntityFrameworkCore.Database=Debug
Além disso, nessa sintaxe de configuração os níveis Trace e Critical se chamam, respectivamente, Verbose e Fatal.
Registrando requisições e respostas HTTP no log
Para habilitar o registro de requisições e respostas HTTP no log:
[HttpLogging]
Enabled=True
Ou, com variáveis de ambiente:
HttpLogging__Enabled=True
OBSERVAÇÃO: Para que o log funcione, é necessário configurar o nível de log da categoria
Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddlewarecomoInformation
Feito isso, as requisições já serão registradas com uma configuração padrão. Se quiser mais controle sobre essas configurações, estão disponíveis as seguintes opções:
| Opção | Tipo | Descrição |
|---|---|---|
| Enabled | bool | Defina como true para habilitar o log HTTP; caso contrário, defina como false. |
| LoggingFields | string | Especifica os campos da requisição e da resposta a serem registrados. Por padrão, registra as propriedades e os headers da requisição e da resposta. Os valores suportados estão listados aqui. Obs.: substitui o LoggingFields padrão. |
| AdditionalLoggingFields | string | Campos adicionais a serem incluídos no log. |
| RequestHeaders | string | Especifica os headers de requisição HTTP que podem ser registrados. Um header não permitido é registrado com o valor [Redacted]. Obs.: substitui os headers de requisição padrão. |
| AdditionalRequestHeaders | string | Headers de requisição HTTP adicionais a serem incluídos no log. |
| ResponseHeaders | string | Especifica os headers de resposta HTTP que podem ser registrados. Um header não permitido é registrado com o valor [Redacted]. Obs.: substitui os headers de resposta padrão. |
| AdditionalResponseHeaders | string | Headers de resposta HTTP adicionais a serem incluídos no log. |
| MediaTypeOptions | string | Configura as codificações de um tipo de mídia específico. Obs.: substitui as opções de tipo de mídia padrão. |
| AdditionalMediaTypeOptions | string | Opções de tipo de mídia adicionais. |
| RequestBodyLogLimit | int | Limita o tamanho máximo do corpo da requisição a ser registrado (em bytes). Padrão: 32 KB. |
| ResponseBodyLogLimit | int | Limita o tamanho máximo do corpo da resposta a ser registrado (em bytes). Padrão: 32 KB. |
Exemplos
Por padrão, o corpo da requisição não é registrado. Para habilitá-lo, use um dos seguintes métodos:
[HttpLogging]
LoggingFields=RequestBody # Override default logging fields
AdditionalLoggingFields=RequestBody # RequestBody will be appended to default logging fields
Ou, com variáveis de ambiente:
HttpLogging__LoggingFields=RequestBody
HttpLogging__AdditionalLoggingFields=RequestBody
Headers não permitidos aparecem com o valor [Redacted]. Para exibir o valor dos headers de que você precisa, use:
[HttpLogging]
AdditionalRequestHeaders=cookie,Sec-Fetch-Dest
Ou, com variáveis de ambiente:
HttpLogging__AdditionalRequestHeaders=cookie,Sec-Fetch-Dest
Se quiser limitar o tamanho do corpo da requisição registrado no log:
[HttpLogging]
RequestBodyLogLimit=5120 # limit to 5KB (5 * 1024) = 5120
Ou, com variáveis de ambiente:
HttpLogging__RequestBodyLogLimit=5120