Skip to content

Configuration Models

Logly uses Pydantic models for type-safe configuration. 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 SinkConfig

config = SinkConfig(
    level="INFO",
    format="{time} | {level} | {message}",
    rotation="daily",
    retention="30 days",
    compression="gzip",
    enqueue=True,
    colorize=True,
    serialize=False,
    pretty_json=None,
    append=True,
    mode="append",
)

Fields:

FieldTypeDefaultDescription
levelstr"INFO"Minimum log level
formatstr | NoneNoneCustom format string
rotationstr | int | NoneNoneRotation policy
retentionstr | int | NoneNoneRetention policy
compressionstr | NoneNoneCompression codec
enqueueboolFalseQueue-based async
colorizebool | NoneNoneANSI color output
serializeboolFalseJSON serialization
pretty_jsondict | PrettyJsonConfig | NoneNoneJSON formatting
appendboolTrueAppend to existing file
modestr"append"File mode: "append" or "overwrite"

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", rotation="daily"),
    ],
    extra={"app_name": "myapp"},
)

Fields:

FieldTypeDefaultDescription
sinkslist[SinkConfig][]List of sink configurations
extradict[str, Any]{}Default extra fields
disabledset[str]set()Disabled level names

Released under the MIT License.