Skip to content

dhjs0000/logbolt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 日志飞起来!

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages