Logging settings

pydantic model horizon.backend.settings.server.log.LoggingSettings

Logging Settings.

Examples

Using json preset:

HORIZON__SERVER__LOGGING__SETUP=True
HORIZON__SERVER__LOGGING__PRESET=json

Passing custom logging config file:

HORIZON__SERVER__LOGGING__SETUP=True
HORIZON__SERVER__LOGGING__CUSTOM_CONFIG_PATH=/some/logging.yml

Setup logging in some other way, e.g. using uvicorn args:

$ export HORIZON__SERVER__LOGGING__SETUP=False
$ python -m horizon.backend --log-level debug
Fields:
field setup: bool = True

If True, setup logging during application start

field preset: Literal['json', 'plain', 'colored'] = 'plain'

Name of logging preset to use.

There are few logging presets bundled to data-horizon[backend] package:

plain preset

This preset is recommended to use in environment which do not support colored output, e.g. CI jobs

# development usage only
version: 1
disable_existing_loggers: false

filters:
  # Add request ID as extra field named `correlation_id` to each log record.
  # This is used in combination with settings.server.request_id.enabled=True
  # See https://github.com/snok/asgi-correlation-id#configure-logging
  correlation_id:
    (): asgi_correlation_id.CorrelationIdFilter
    uuid_length: 32
    default_value: '-'

formatters:
  plain:
    (): logging.Formatter
    # Add correlation_id to log records
    fmt: '%(asctime)s.%(msecs)03d %(processName)s:%(process)d %(name)s:%(lineno)d [%(levelname)s] %(correlation_id)s %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'

handlers:
  main:
    class: logging.StreamHandler
    formatter: plain
    filters: [correlation_id]
    stream: ext://sys.stdout

loggers:
  '':
    handlers: [main]
    level: INFO
    propagate: false
  uvicorn:
    handlers: [main]
    level: INFO
    propagate: false
colored preset

This preset is recommended to use in development environment, as it simplifies debugging. Each log record is output with color specific for a log level

# development usage only
version: 1
disable_existing_loggers: false

filters:
  # Add request ID as extra field named `correlation_id` to each log record.
  # This is used in combination with settings.server.request_id.enabled=True
  # See https://github.com/snok/asgi-correlation-id#configure-logging
  correlation_id:
    (): asgi_correlation_id.CorrelationIdFilter
    uuid_length: 32
    default_value: '-'

formatters:
  colored:
    (): coloredlogs.ColoredFormatter
    # Add correlation_id to log records
    fmt: '%(asctime)s.%(msecs)03d %(processName)s:%(process)d %(name)s:%(lineno)d [%(levelname)s] %(correlation_id)s %(message)s'
    datefmt: '%Y-%m-%d %H:%M:%S'

handlers:
  main:
    class: logging.StreamHandler
    formatter: colored
    filters: [correlation_id]
    stream: ext://sys.stdout

loggers:
  '':
    handlers: [main]
    level: INFO
    propagate: false
  uvicorn:
    handlers: [main]
    level: INFO
    propagate: false
json preset

This preset is recommended to use in production environment, as it allows to avoid writing complex log parsing configs. Each log record is output as JSON line

version: 1
disable_existing_loggers: false

filters:
  # Add request ID as extra field named `correlation_id` to each log record.
  # This is used in combination with settings.server.request_id.enabled=True
  # See https://github.com/snok/asgi-correlation-id#configure-logging
  correlation_id:
    (): asgi_correlation_id.CorrelationIdFilter
    uuid_length: 32
    default_value: '-'

formatters:
  json:
    (): pythonjsonlogger.jsonlogger.JsonFormatter
    # Add correlation_id to log records
    fmt: '%(processName)s %(process)d %(threadName)s %(thread)d %(name)s %(lineno)d %(levelname)s %(message)s %(correlation_id)s'
    timestamp: true

handlers:
  main:
    class: logging.StreamHandler
    formatter: json
    filters: [correlation_id]
    stream: ext://sys.stdout

loggers:
  '':
    handlers: [main]
    level: INFO
    propagate: false
  uvicorn:
    handlers: [main]
    level: INFO
    propagate: false
field custom_config_path: Path | None = None

Path to custom logging configuration file. If set, overrides preset value.

File content should be in YAML format and conform logging.dictConfig.

get_log_config_path() Path