Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

certlib.log

...is a library that extends the standard logging toolset. It allows you to introduce structured logging with minimal fuss, and/or leverage some other logging goodies (e.g., {}-style message formatting).

Basic Info

You can install the certlib.log library by running (typically, in a virtual environment) the command:

python3 -m pip install certlib.log

The library is compatible with Python 3.10 and all newer versions of Python. It uses only the Python standard library, i.e., it does not depend on any third-party packages.

Principles and Benefits

The primary reason for creating certlib.log was to make it easier to configure structured logging across various systems created and used by CERT Polska -- in a possibly consistent way and without requiring extensive adjustments.

An important design decision was to build the library on top of the standard logging mechanisms (rather than introducing alternative machinery).

This approach makes it possible to:

  • just start using the library in existing projects -- especially, to enable structured logging (often without changing a single line of code);

  • depending on the needs, gradually introduce other features provided by the library (such as {}-style message formatting, data-only message-less log records, auto-making of log record fields, e.g., from context variables...);

  • retain existing logging configuration methods (whether using an *.ini file or loading a configuration dict).

Examples

Minimal Structured Logging Setup

import logging, certlib.log

some_handler = logging.StreamHandler()
some_handler.setFormatter(
    certlib.log.StructuredLogsFormatter()
)
logging.getLogger().addHandler(some_handler)

More Elaborate Variant, with Auto-Makers and Defaults

import logging.config

logging.config.dictConfig({
    "formatters": {
        "structured": {
            "()": "certlib.log.StructuredLogsFormatter",
            "defaults": {
                # * Each key in this dict should be an *output data* key.
                # * Each value should specify the respective *default value*.
                "system": "MyExample",
                "component": "MyAPI",
                "component_type": "web"
            },
            "auto_makers": {
                # * Each key in this dict should be an *output data* key.
                # * Each value should specify an *argumentless callable*
                #   (for example, the `get()` method of some `ContextVar`).
                "client_ip": "myexample.myapi.client_ip_context_var.get",
                "nano_time": "time.time_ns"
            }
        }
    },
    "handlers": {
        "stderr": {
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stderr",
            "formatter": "structured"
        }
    },
    "root": {
        "level": "INFO",
        "handlers": ["stderr"]
    },
    "disable_existing_loggers": False,
    "version": 1
})

Logging with {}-Formatted Text Message or No Text Message

import datetime as dt
import ipaddress
import logging
from certlib.log import xm   # Note: `xm` is short for `ExtendedMessage`

logger = logging.getLogger(__name__)

...

def example_with_text_message_formatting(city, humidity, error_summary=None):
    if error_summary:
        logger.error(xm(
            'An error occurred: {!r}', error_summary,
            exc_info=True, stack_info=True, stacklevel=2,
        ))

    logger.warning(xm('Humidity in {} is {:.1%}', city, humidity))

    logger.info(xm(
        # (Here: making use of `datetime`-specific format codes...)
        'Today is day #{today:%j} of the year {today:%Y}',
        today=dt.date.today(),

        # Arbitrary data items can also be given (which is especially
        # useful when `certlib.log.StructuredLogsFormatter` is in use).
        some_extra_item=42,
        other_arbitrary_stuff={'foo': [
            {'my-ip': ipaddress.IPv4Address('192.168.0.1')},
            dt.time(12, 59),
        ]},
    ))

def example_with_no_text(temperature, pressure, debug_data_dict, calm=True):
    # (The possibility to focus on pure data, *without* the need
    # to pass any *text-message*-related arguments, is especially
    # handy when `certlib.log.StructuredLogsFormatter` is in use.)

    if calm:
        logger.info(xm(
            # Just data:
            temperature=temperature,
            pressure=pressure,
        ))
    else:
        logger.error(xm(
            # Just data:
            temperature=temperature,
            pressure=pressure,

            # Special arguments:
            exc_info=True,
            stack_info=True,
            stacklevel=2,
        ))

    # Providing data by passing a single dict is also OK:
    logger.debug(xm(debug_data_dict))

You can find more examples in the User's Guide.

Copyright and License

Copyright (c) 2026, CERT Polska. All rights reserved.

The certlib.log library is free software; you can redistribute and/or modify it under the terms of the BSD 3-Clause "New" or "Revised" License (see the LICENSE.txt file in the source code repository).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

certlib_log-1.0.0b6.tar.gz (127.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

certlib_log-1.0.0b6-py3-none-any.whl (57.1 kB view details)

Uploaded Python 3

File details

Details for the file certlib_log-1.0.0b6.tar.gz.

File metadata

  • Download URL: certlib_log-1.0.0b6.tar.gz
  • Upload date:
  • Size: 127.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for certlib_log-1.0.0b6.tar.gz
Algorithm Hash digest
SHA256 29a4721331316f031075ad9ea7417d3661469f4b7773c9b59f793730989c61a3
MD5 974cd8214867cd546f8822530e692b32
BLAKE2b-256 57e39a2d6f3697e92267f155646327763fbbb499e4446e1aefc5f678b15d37bc

See more details on using hashes here.

File details

Details for the file certlib_log-1.0.0b6-py3-none-any.whl.

File metadata

  • Download URL: certlib_log-1.0.0b6-py3-none-any.whl
  • Upload date:
  • Size: 57.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for certlib_log-1.0.0b6-py3-none-any.whl
Algorithm Hash digest
SHA256 27c63a1a9a97f5309ce46021b72355889b45a1c82f271fc0339972fe5df18845
MD5 b0fc26176d3af4f212f3daae5f35d2ab
BLAKE2b-256 488ddf47af2bc51f2ef148d438e65ca6a75e8c2896324d2ae94302524db47105

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.0b6 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page