Skip to main content

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

Project description

LogBolt 🚀

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

Python License PyPI Tests

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

API文档

⚡ 性能基准

在 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.2.0.tar.gz (18.2 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.2.0-py3-none-any.whl (14.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for logbolt-0.2.0.tar.gz
Algorithm Hash digest
SHA256 dcc48ea789ca882528389597b7a0a16808ee9dde364bf2c97809bdc06c017f74
MD5 abd1880d8b969a160e35d61756e095c1
BLAKE2b-256 2c5a94c9d67b15684176f77bd2ebec26d27da0770d9474bc3cbc78e4bb20467e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: logbolt-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 14.6 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 887f9c4bd0a3432c87bcef2c0b5d8143a3150229d02e053c47226872cedbddc1
MD5 bb07c7f70761969cd62b6c1ffa045bab
BLAKE2b-256 eb6415ac96f7ea7f652ec7ca2be8a24caa5378b082a81d62dc587a6cbff12dc6

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