Skip to main content

轻量级结构化日志库,提供彩色终端输出和上下文绑定

Project description

dictlog

English

structlog 启发的轻量级结构化日志库,提供彩色终端输出和上下文绑定。

相比 structlog,dictlog 的方法签名完全标注了类型,编辑器可以正常补全和提示。

功能肯定没有 structlog 强大,但是终于不用再看编辑器的错误提示了。

由于是基于系统库 logging 实现,使用上完全兼容。

Demo

特性

  • 结构化日志 + key-value 上下文绑定(bind/unbind
  • 彩色终端输出,紧凑格式
  • 支持 6 种日志级别:TRACE < DEBUG < INFO < WARNING < ERROR < CRITICAL
  • 支持子 logger(用 . 分隔名称)
  • exception() 方法自动附加异常堆栈;所有日志方法均支持 exc_info*args%-style 格式化)和 stacklevel 参数,与标准 logging 保持一致
  • 开箱即用,零配置
  • 完整的类型标注,编辑器友好

安装

pip install dictlog
# 或使用 uv
uv add dictlog

要求 Python >= 3.9。

使用

import dictlog

# 基本用法
log = dictlog.get_logger("myapp")
# 调整日志级别,与 logging.DEBUG 等价,默认是 WARNING
log.level = dictlog.DEBUG

# 支持的日志级别:TRACE(5) < DEBUG(10) < INFO(20) < WARNING(30) < ERROR(40) < CRITICAL(50)
log.trace("detailed debug info", user_id=123)  # 最详细的调试信息
log.debug("debug message", port=8080)
log.info("server started", port=8080)

# % 风格格式化参数,与 logging 用法一致
log.info("hello %s", "world")
log.debug("x=%d y=%d", 1, 2)

# 自定义 stacklevel(默认 1,即直接调用方的帧)
def my_wrapper():
    log.info("from wrapper", stacklevel=2)  # 上报到调用 my_wrapper() 的代码行

# 绑定上下文,后续调用自动携带
log = log.bind(user="alice")
log.info("user logged in")          # 自带 user=alice
log = log.unbind("user")
log.info("context removed")         # 不再包含 user

# 捕获异常并附加堆栈,与 logging 用法一致
try:
    1 / 0
except ZeroDivisionError:
    log.error("something went wrong", exc_info=True)
    # 或使用 exception(),默认 exc_info=True
    log.exception("something went wrong")

输出到日志文件

dictlog 与 logging.basicConfig 完全兼容。通过 basicConfig 输出到文件时,日志内容为纯文本(包含 key-value 字段,但不包含颜色码):

import logging
import dictlog

# 配置输出到文件
logging.basicConfig(
    level=dictlog.INFO,
    filename="app.log",
    format="%(levelname)s - %(message)s"
)

log = dictlog.get_logger("myapp")
log.info("user logged in", user="alice", ip="192.168.1.1")

文件 app.log 中的内容:

INFO - user logged in user=alice ip=192.168.1.1

dictlog 会同时输出到文件(通过 basicConfig)和终端(带颜色)。如果只需要文件输出,可以禁用 dictlog 的默认 handler。

dictlog 是如何调用 logging 的

log = dictlog.get_logger("foo", name=123)
log.info("hello")

等价于

root_log = logging.getLogger("dictlog")
if not root_log.handlers:
    handler = logging.StreamHandler()
    handler.setFormatter(_formatter)  # ColorFormatter
    root_log.addHandler(handler)
log = logging.getLogger("dictlog.foo")
log.info("hello %s", "name=123")

如果不想使用 dictlog. 开头,可以通过修改 dictlog._ROOT_NAME 实现

开发

# 安装依赖
uv sync

# 运行 pre-commit hooks
uv run pre-commit run --all-files

# 运行示例
uv run dictlog.py

License

MIT

Project details


Download files

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

Source Distribution

dictlog-0.4.2.tar.gz (103.0 kB view details)

Uploaded Source

Built Distribution

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

dictlog-0.4.2-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file dictlog-0.4.2.tar.gz.

File metadata

  • Download URL: dictlog-0.4.2.tar.gz
  • Upload date:
  • Size: 103.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dictlog-0.4.2.tar.gz
Algorithm Hash digest
SHA256 7a132318c9270ec2c4df6d56b05ba3120921d37da7019fe9e6324999fd6ce9ab
MD5 4371b2025502346a3361390540f70c2d
BLAKE2b-256 c7cd1ee227092dc73feaca5e2b482eff9d895e6e6fc3e8c389988f7f939e75fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for dictlog-0.4.2.tar.gz:

Publisher: publish.yml on uiautodev/dictlog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dictlog-0.4.2-py3-none-any.whl.

File metadata

  • Download URL: dictlog-0.4.2-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dictlog-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 008f5ca4c2595731c4bb8da62b910ad8ac136bad27c9f095cb2b361ee8145347
MD5 dafa193b3737a9e53a0f081e39951842
BLAKE2b-256 1978d44f290b490c6b747d179ad889b13f848c33132a1d053f22e94e85e006ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for dictlog-0.4.2-py3-none-any.whl:

Publisher: publish.yml on uiautodev/dictlog

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page