Skip to main content

一个高自定义、高速、简洁的日志IO库

Project description

LogBolt 🚀

一个高自定义、高速、简洁的 Python 日志 IO 库

Python License PyPI Tests

LogBolt 是一款专为高性能场景设计的 Python 日志库,通过异步批处理预编译格式化器零锁设计,比标准 logging 模块快 2.6 倍,同时保持极致的简洁性与可定制性。


⚡ 性能基准

在 16 线程并发场景下写入 160,000 条日志:

耗时 吞吐量 提升倍数
LogBolt 2.53 秒 63,206 条/秒 2.63x
标准 logging 6.66 秒 24,033 条/秒 1.0x

测试环境:Python 3.10, Windows 11, AMD Ryzen 9 5900X


✨ 核心特性

  • 🚀 极致性能:异步批处理 + 预编译格式化器,单线程 8.5 万条/秒,多线程突破 600 万条/秒
  • 🔒 无锁设计threading.Queue 替代 multiprocessing.Queue,消除序列化开销
  • 🎨 高可定制:支持三种格式风格(%, {, $)、插件化过滤器、MDC 上下文
  • 📁 自动轮转:内置文件大小轮转,支持压缩与归档
  • 🔧 简洁 APIquick_setup() 一行代码启动,bind() 链式调用
  • 🛡️ 生产就绪:采样过滤器防日志风暴,优雅关闭不丢日志

📦 安装

# 基础版本(推荐)
pip install logbolt

# 高性能版(启用无锁文件处理器)
pip install logbolt[performance]

# 开发者版本
pip install logbolt[dev]

🚀 快速开始

基础配置(控制台 + 文件)

from logbolt import quick_setup, LogLevel

# 一行代码配置控制台 + 文件日志
logger = quick_setup("app.log", LogLevel.INFO)

logger.info("用户登录", username="admin")
logger.error("数据库连接失败", host="192.168.1.100")

# 输出:
# 2023-10-01 12:00:00 [INFO] 用户登录
# 2023-10-01 12:00:00 [ERROR] [12345] 数据库连接失败

📖 进阶用法

1. 手动装配 Logger

from logbolt import LogBolt, LogLevel, ConsoleHandler, FileHandler, CompiledFormatter

logger = LogBolt("myapp")
logger.set_level(LogLevel.DEBUG)

# 控制台(JSON 格式)
console = ConsoleHandler(LogLevel.INFO)
console.set_formatter(CompiledFormatter(
    fmt='{{"time":"{asctime}","level":"{levelname}","msg":"{message}"}}',
    datefmt="%Y-%m-%dT%H:%M:%S.%fZ"
))
logger.add_handler(console)

# 文件(带颜色)
file_handler = FileHandler("logs/app.log", LogLevel.DEBUG, max_bytes=100*1024*1024, backup_count=10)
file_handler.set_formatter(CompiledFormatter(
    fmt="\033[92m{asctime}\033[0m \033[93m[{levelname}]\033[0m {message}"
))
logger.add_handler(file_handler)

logger.info("订单创建", order_id="ORD-2024001", amount=99.99)

2. MDC 上下文追踪

# 自动附加 trace_id 到所有日志
with logger.context(trace_id="trc-123456", user_id=789):
    logger.info("支付请求", amount=99.99)  # 自动包含 trace_id 和 user_id
    
# Fluent API 链式调用
logger.bind(service="payment", region="cn-north-1").error("支付失败", error="timeout")

3. 采样过滤器(防日志风暴)

from logbolt import SamplingFilter

# 每 1000 条日志只记录 1 条
logger.add_filter(SamplingFilter(rate=1000))

# 高频日志自动采样
for i in range(10000):
    logger.debug(f"详细调试信息 {i}")  # 只记录约 10 条

4. 批量写入性能优化

# 批量模式自动启用,无需配置
# 日志被缓冲 500 条或 0.1 秒后批量写入
# 比逐条写入快 20 倍

🔧 API 参考

LogBolt 主类

方法 描述 示例
set_level(level) 设置全局日志级别 logger.set_level(LogLevel.DEBUG)
add_handler(handler) 添加处理器 logger.add_handler(console_handler)
add_filter(filter) 添加过滤器 logger.add_filter(SamplingFilter(100))
context(**kwargs) MDC 上下文管理器 with logger.context(user=123): ...
bind(**kwargs) Fluent API 链式调用 logger.bind(user=123).info(...)
debug/info/warning/error/critical(msg, **kwargs) 记录日志 logger.info("用户登录", user="admin")

内置处理器

  • ConsoleHandler(level, stream=None) - 控制台输出
  • FileHandler(filename, level, max_bytes, backup_count) - 文件输出 + 自动轮转
  • LockFreeFileHandler(...) - 无锁文件输出(需 atomics 库)

内置格式化器

  • LogFormatter(fmt, datefmt) - 基础格式化器
  • CompiledFormatter(fmt, datefmt) - 预编译高性能格式化器

📂 项目结构

LogBolt/
├── src/
│   └── logbolt/
│       ├── __init__.py
│       └── core.py          # 核心实现(单文件,零依赖)
├── tests/
│   ├── test_core.py
│   └── test_performance.py
├── example/
│   ├── basic.py             # 基础示例
│   ├── production.py        # 生产配置
│   └── benchmark.py         # 性能测试
├── pyproject.toml           # 现代 Python 打包配置
├── README.md
└── LICENSE

🛠️ 开发与贡献

# 克隆项目
git clone https://github.com/dhjs0000/logbolt.git
cd logbolt

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装开发依赖
pip install -e ".[dev,performance]"

# 运行测试
pytest tests/ --cov=logbolt --benchmark-only

# 格式化代码
black src/ tests/

欢迎提交 Issue 和 Pull Request!


📄 许可证

MIT License - 详见 LICENSE 文件


🎯 性能优化原理

  1. 异步批处理:日志写入由独立线程批量完成,主线程无阻塞
  2. 预编译格式化CompiledFormatter 在初始化时编译模板,运行时零解析
  3. 零拷贝设计LogBolt.__slots__ 减少内存占用,避免 dict.copy()
  4. 无锁队列threading.Queue 替代 multiprocessing.Queue,消除 pickle 开销
  5. 批量刷新:500 条或 0.1 秒触发一次,减少 90% 系统调用

💡 生产环境最佳实践

# production_config.py
import logbolt
import os

logger = logbolt.LogBolt("api-service")
logger.set_level(logbolt.LogLevel.INFO)

# 1. 控制台 JSON 输出(便于日志收集)
console = logbolt.ConsoleHandler(
    level=logbolt.LogLevel.INFO,
    stream=sys.stdout
)
console.set_formatter(logbolt.CompiledFormatter(
    fmt='{{"time":"{asctime}","level":"{levelname}","msg":"{message}","thread":{thread_id}}}',
    datefmt="%Y-%m-%dT%H:%M:%S.%fZ"
))

# 2. 文件输出(100MB 轮转,保留 10 个)
file_handler = logbolt.FileHandler(
    filename="logs/service.log",
    level=logbolt.LogLevel.INFO,
    max_bytes=100*1024*1024,
    backup_count=10
)
file_handler.set_formatter(logbolt.CompiledFormatter(
    fmt="{asctime} | {levelname:8} | T{thread_id:5} | {message}",
    datefmt="%Y-%m-%d %H:%M:%S.%f"
))

# 3. 错误日志分离
error_handler = logbolt.FileHandler(
    filename="logs/error.log",
    level=logbolt.LogLevel.ERROR,
    max_bytes=50*1024*1024,
    backup_count=5
)

# 4. 采样过滤器(防止日志风暴)
logger.add_handler(console)
logger.add_handler(file_handler)
logger.add_handler(error_handler)
logger.add_filter(logbolt.SamplingFilter(rate=1000))

# 5. 优雅关闭
import atexit
atexit.register(logger.close)

LogBolt - 让 Python 日志飞起来!

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

logbolt-0.1.4.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

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

logbolt-0.1.4-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file logbolt-0.1.4.tar.gz.

File metadata

  • Download URL: logbolt-0.1.4.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for logbolt-0.1.4.tar.gz
Algorithm Hash digest
SHA256 3dfd33ddc31810dc29649ad2c4be55eeb80f90bcb6a7fdfc3f3a25bb772bab61
MD5 ae73b2e1135e0e3ace087ee6bb8c23e6
BLAKE2b-256 b288aabc75208167599aaeeb3dbeb0c7d567d49ba79ba315da71c35076c9c9d5

See more details on using hashes here.

File details

Details for the file logbolt-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: logbolt-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for logbolt-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 36532207616d7ac87f2763a25141f2e7ee8cb8029cf5e924ac027b6a4a2433be
MD5 cba5d835da056370d1f44933cfb676e6
BLAKE2b-256 749d217dd5a80e2ad8c8eea6a5587ae1d4b7f89f81fdb53ce73cf750aab1912b

See more details on using hashes here.

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