Skip to content

Configuration Models ​

Logly uses stdlib dataclasses with targeted runtime validation for type-safe configuration. There are no validation-framework dependencies. Import them from logly.models:

python
from logly.models import (
    RotationPolicy,
    RetentionPolicy,
    CompressionPolicy,
    PrettyJsonConfig,
    SinkConfig,
    LoggerConfig,
)

RotationPolicy ​

Controls when log files are rotated.

python
from logly.models import RotationPolicy

# Rotate daily
policy = RotationPolicy(kind="clock", value="daily")

# Rotate at 10 MB
policy = RotationPolicy(kind="size", value="10 MB")

# Rotate every week on Monday
policy = RotationPolicy(kind="weekday", value="monday")

# Never rotate
policy = RotationPolicy(kind="never")

# Custom rotation function
policy = RotationPolicy(kind="callable", value=my_rotation_func)

Fields:

FieldTypeDefaultDescription
kindstr"never"Rotation type: "never", "size", "interval", "clock", "weekday", "callable"
valueint | str | NoneNoneRotation parameter (size, interval, weekday, or callable)

Rotation Kinds ​

KindValueExample
"never"NoneNo rotation
"size"Size string"10 MB", "1 GB", "500 KB"
"interval"Time string"daily", "hourly", "weekly", "monthly"
"clock"Time string"daily", "midnight", "weekly"
"weekday"Day name"monday", "friday", "sunday"
"callable"Functionlambda msg: "archive" in msg.path

RetentionPolicy ​

Controls when old log files are deleted.

python
from logly.models import RetentionPolicy

# Keep 30 most recent files
policy = RetentionPolicy(count=30)

# Keep files for 7 days
policy = RetentionPolicy(seconds=7 * 24 * 3600)

Fields:

FieldTypeDefaultDescription
countint | NoneNoneMaximum number of files to keep
secondsint | NoneNoneMaximum age in seconds

CompressionPolicy ​

Controls how old log files are compressed.

python
from logly.models import CompressionPolicy

# Gzip compression
policy = CompressionPolicy(codec="gzip")

# Zip archive
policy = CompressionPolicy(codec="zip")

# No compression
policy = CompressionPolicy(codec="none")

Fields:

FieldTypeDefaultDescription
codecstr"none"Compression codec

Supported Codecs ​

CodecExtensionDescription
"none"No compression
"gzip" / "gz".gzGzip compression
"zip".zipZip archive
"bz2".bz2Bzip2 compression
"xz" / "lzma".xzXZ/LZMA compression
"zstd".zstZstandard compression
"tar".gzAlias for gzip
"tar.gz" / "tgz".gzAlias for gzip
"tar.bz2".bz2Alias for bz2
"tar.xz".xzAlias for xz

PrettyJsonConfig ​

Controls JSON serialization formatting.

python
from logly.models import PrettyJsonConfig

# Default formatting
config = PrettyJsonConfig()

# Custom formatting
config = PrettyJsonConfig(
    indent=2,
    sort_keys=True,
    ensure_ascii=True,
    separators=(", ", ": "),
)

Fields:

FieldTypeDefaultDescription
indentint4JSON indentation spaces
sort_keysboolFalseSort dictionary keys
ensure_asciiboolFalseEscape non-ASCII characters
separatorstuple[str, str] | NoneNone(item_separator, key_separator)

Examples ​

python
# Compact JSON
config = PrettyJsonConfig(indent=None, separators=(",", ":"))

# Pretty JSON with sorted keys
config = PrettyJsonConfig(indent=2, sort_keys=True)

# ASCII-safe JSON
config = PrettyJsonConfig(ensure_ascii=True)

SinkConfig ​

Complete sink configuration model.

python
from logly.models import (
    CompressionPolicy,
    RetentionPolicy,
    RotationPolicy,
    SinkConfig,
)

config = SinkConfig(
    level="INFO",
    format="{time} | {level} | {message}",
    rotation=RotationPolicy(kind="size", value=10_000_000),
    retention=RetentionPolicy(count=7),
    compression=CompressionPolicy(codec="gzip"),
    enqueue=True,
    colorize=True,
    serialize=False,
    pretty_json=None,
    append=True,
    mode="append",
)

String shorthands like rotation="daily" are accepted by logger.add(...), not by SinkConfig — pass model instances (or plain dicts, which are coerced) here.

Fields:

FieldTypeDefaultDescription
levelstr"INFO"Minimum log level
formatstr"{level} | {message}"Format template string
rotationRotationPolicy | dict | NoneNoneRotation policy model or dict
retentionRetentionPolicy | dict | NoneNoneRetention policy model or dict
compressionCompressionPolicy | dict | NoneNoneCompression policy model or dict
enqueueboolFalseQueue-based async
colorizebool | NoneNoneANSI color output
serializeboolFalseJSON serialization
pretty_jsonPrettyJsonConfig | dict | NoneNoneJSON formatting
appendboolTrueAppend to existing file
mode"append" | "overwrite""append"File open mode

LoggerConfig ​

Complete logger configuration model.

python
from logly.models import LoggerConfig, SinkConfig

config = LoggerConfig(
    sinks=[
        SinkConfig(level="INFO", format="{time} | {level} | {message}"),
        SinkConfig(level="DEBUG"),
    ],
    disabled={"debug-only-logger"},
)

Fields:

FieldTypeDefaultDescription
sinkslist[SinkConfig][]List of sink configurations (dicts are coerced)
disabledset[str]set()Disabled logger names

Native serialization ​

python
from logly.models import SinkConfig

config = SinkConfig(level="INFO")

# Serialize to a plain dict
data = config.to_dict()
assert data["level"] == "INFO"

# Build back from a plain mapping (validated)
restored = SinkConfig.from_dict({"level": "DEBUG"})
assert restored.level == "DEBUG"

Validation errors raise logly.models.ValidationError (a ValueError subclass), so except ValueError keeps working.

Released under the MIT License.