Skip to content

Logging

Logging configuration using Serilog for console, file, PostgreSQL database, and OpenTelemetry outputs.

For the task-oriented walkthrough — log channels, seeing executed SQL, PostgreSQL raise messages in logs, production recipes — see the Logging Guide.

Overview

json
json
{
  "Log": {
    "MinimalLevels": {
      "NpgsqlRest": "Information",
      "System": "Warning",
      "Microsoft": "Warning"
    },
    "ToConsole": true,
    "ConsoleMinimumLevel": "Verbose",
    "ToFile": false,
    "FilePath": "logs/log.txt",
    "FileSizeLimitBytes": 30000000,
    "FileMinimumLevel": "Verbose",
    "RetainedFileCountLimit": 30,
    "RollOnFileSizeLimit": true,
    "ToPostgres": false,
    "PostgresCommand": "call log($1,$2,$3,$4,$5)",
    "PostgresMinimumLevel": "Verbose",
    "ToOpenTelemetry": false,
    "OTLPEndpoint": "http://localhost:4317",
    "OTLPProtocol": "Grpc",
    "OTLPResourceAttributes": {
      "service.name": "{application}",
      "service.version": "1.0",
      "service.environment": "{environment}"
    },
    "OTLPHeaders": {},
    "OTLPMinimumLevel": "Verbose",
    "OutputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
  }
}

Log Levels

Available log levels (from most to least verbose):

LevelDescription
VerboseMost detailed logging, typically for debugging
DebugDebugging information
InformationGeneral operational information
WarningWarnings that don't stop execution
ErrorErrors that affect specific operations
FatalCritical errors that stop the application
OffFully silences a channel (aliases: None, Silent; MinimalLevels entries only, since 3.19.0)

See Serilog Configuration Basics for more details.

Minimal Levels

Configure minimum log levels per source context:

json
json
{
  "Log": {
    "MinimalLevels": {
      "NpgsqlRest": "Information",
      "NpgsqlRestClient": "Information",
      "NpgsqlRestTest": "Information",
      "System": "Warning",
      "Microsoft": "Warning"
    }
  }
}
SettingTypeDefaultDescription
NpgsqlReststring"Information"The endpoint engine: endpoint creation and annotations at Debug; discovery queries, describe phase, and (with LogCommands) executed SQL at Verbose.
NpgsqlRestClientstring"Information"The client host: configuration processing, auth setup, startup detail. When ApplicationName is set, log lines display that name as the source context instead of NpgsqlRestClient — but this configuration key keeps working unchanged (it is mapped to the actual channel name automatically).
NpgsqlRestTeststring"Information"The SQL test runner (--test): discovery at Debug, every test statement and HTTP invocation at Verbose. Name configurable via TestRunner.LoggerName.
Systemstring"Warning"Log level for the .NET System namespace.
Microsoftstring"Warning"Log level for the Microsoft namespace (ASP.NET Core, etc.).

Any entry accepts "Off" (since 3.19.0) to silence that channel completely — see the Logging Guide.

Console Output

json
json
{
  "Log": {
    "ToConsole": true,
    "ConsoleMinimumLevel": "Verbose"
  }
}
SettingTypeDefaultDescription
ToConsolebooltrueEnable logging to console output.
ConsoleMinimumLevelstring"Verbose"Minimum log level for console output.

File Output

json
json
{
  "Log": {
    "ToFile": false,
    "FilePath": "logs/log.txt",
    "FileSizeLimitBytes": 30000000,
    "FileMinimumLevel": "Verbose",
    "RetainedFileCountLimit": 30,
    "RollOnFileSizeLimit": true
  }
}
SettingTypeDefaultDescription
ToFileboolfalseEnable logging to file system.
FilePathstring"logs/log.txt"File path for log files.
FileSizeLimitBytesint30000000Maximum size limit for log files in bytes before rolling (30 MB).
FileMinimumLevelstring"Verbose"Minimum log level for file output.
RetainedFileCountLimitint30Maximum number of log files to retain.
RollOnFileSizeLimitbooltrueCreate a new log file when size limit is reached.

PostgreSQL Output

json
json
{
  "Log": {
    "ToPostgres": false,
    "PostgresCommand": "call log($1,$2,$3,$4,$5)",
    "PostgresMinimumLevel": "Verbose"
  }
}
SettingTypeDefaultDescription
ToPostgresboolfalseEnable logging to PostgreSQL database.
PostgresCommandstring"call log($1,$2,$3,$4,$5)"PostgreSQL command to execute for database logging.
PostgresMinimumLevelstring"Verbose"Minimum log level for PostgreSQL output.

PostgreSQL Command Parameters

The PostgresCommand receives five parameters:

ParameterTypeDescription
$1textLog level (Verbose, Debug, Information, Warning, Error, Fatal)
$2textLog message
$3timestamptzTimestamp in UTC
$4textException text (or null if no exception)
$5textSource context (logger name)

OpenTelemetry Output

json
json
{
  "Log": {
    "ToOpenTelemetry": false,
    "OTLPEndpoint": "http://localhost:4317",
    "OTLPProtocol": "Grpc",
    "OTLPResourceAttributes": {
      "service.name": "{application}",
      "service.version": "1.0",
      "service.environment": "{environment}"
    },
    "OTLPHeaders": {},
    "OTLPMinimumLevel": "Verbose"
  }
}
SettingTypeDefaultDescription
ToOpenTelemetryboolfalseEnable OpenTelemetry protocol (OTLP) logging output.
OTLPEndpointstring"http://localhost:4317"OTLP collector endpoint URL.
OTLPProtocolstring"Grpc"Protocol for OTLP: "Grpc" or "HttpProtobuf".
OTLPResourceAttributesobject(see below)Resource attributes sent with logs.
OTLPHeadersobject{}Custom headers for OTLP requests.
OTLPMinimumLevelstring"Verbose"Minimum log level for OTLP output.

Resource Attributes

Default resource attributes use placeholders:

AttributeDefaultDescription
service.name"{application}"Application name from ApplicationName setting.
service.version"1.0"Application version.
service.environment"{environment}"Environment name from EnvironmentName setting.

Output Template

json
json
{
  "Log": {
    "OutputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
  }
}
SettingTypeDefaultDescription
OutputTemplatestring"[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"Serilog output template for formatting log messages.

See Serilog Formatting Output for template syntax.

Complete Example

Production configuration with file and PostgreSQL logging:

json
json
{
  "Log": {
    "MinimalLevels": {
      "NpgsqlRest": "Information",
      "System": "Warning",
      "Microsoft": "Warning"
    },
    "ToConsole": true,
    "ConsoleMinimumLevel": "Information",
    "ToFile": true,
    "FilePath": "/var/log/npgsqlrest/app.log",
    "FileSizeLimitBytes": 50000000,
    "FileMinimumLevel": "Information",
    "RetainedFileCountLimit": 14,
    "RollOnFileSizeLimit": true,
    "ToPostgres": true,
    "PostgresCommand": "call log($1,$2,$3,$4,$5)",
    "PostgresMinimumLevel": "Warning",
    "ToOpenTelemetry": false,
    "OutputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Level:u3}] {Message:lj} [{SourceContext}]{NewLine}{Exception}"
  }
}

Next Steps

Comments