一个高自定义、高速、简洁的 Python 日志 IO 库
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 上下文 - 📁 自动轮转:内置文件大小轮转,支持压缩与归档
- 🔧 简洁 API:
quick_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] 数据库连接失败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)# 自动附加 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")from logbolt import SamplingFilter
# 每 1000 条日志只记录 1 条
logger.add_filter(SamplingFilter(rate=1000))
# 高频日志自动采样
for i in range(10000):
logger.debug(f"详细调试信息 {i}") # 只记录约 10 条# 批量模式自动启用,无需配置
# 日志被缓冲 500 条或 0.1 秒后批量写入
# 比逐条写入快 20 倍| 方法 | 描述 | 示例 |
|---|---|---|
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 文件
- 异步批处理:日志写入由独立线程批量完成,主线程无阻塞
- 预编译格式化:
CompiledFormatter在初始化时编译模板,运行时零解析 - 零拷贝设计:
LogBolt.__slots__减少内存占用,避免dict.copy() - 无锁队列:
threading.Queue替代multiprocessing.Queue,消除pickle开销 - 批量刷新: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 日志飞起来!