PYTHON日志神器nb_log详细介绍和使用说明

发布于:2025-07-20 ⋅ 阅读:(15) ⋅ 点赞:(0)

个人主页云纳星辰怀自在

座右铭:“所谓坚持,就是觉得还有希望!


Python的nb_log是一个功能强大且高度灵活的日志记录模块,基于Python内置的logging模块封装,解决了传统日志库的常见痛点(如重复打印、配置复杂等),并增加了多项创新特性。

一、核心特性与优势

  1. 智能print增强

    • 自动捕获所有print输出,添加文件名+行号标记(如 [demo.py:18]

    • 支持IDE控制台点击跳转源码位置

    • 开关:AUTO_PATCH_PRINT = True

  2. 多进程安全切割

    • 内置高性能切割器(log_file_handler_type=1

    • 速度对比:

      平台 原生模块 nb_log 提升倍数
      Windows ConcurrentRotating 内置切割器 100×
      Linux ConcurrentRotating 内置切割器 10×
  3. 零重复日志机制

    • 自动修复原生logging重复记录问题

    • 确保同一日志绝不重复输出

  4. 多通道输出

    graph LR
    A[Logger] --> B[控制台]
    A --> C[日志文件]
    A --> D[钉钉]
    A --> E[邮件]
    A --> F[MongoDB]
    A --> G[Kafka]

二、安装与配置

1. 安装方式
# 标准安装
pip install nb_log

# 国内镜像加速
pip install nb_log==8.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 初始化配置
import nb_log  # 自动生成配置文件
from nb_log import LogManager

# 默认日志器(生成在项目根目录)
logger = LogManager('app').get_logger_and_add_handlers()
logger.info("安装成功!")  # 控制台显示彩色日志[1,3](@ref)

 -->环境问题​​:

  • 若未生成配置文件,设置 PYTHONPATH指向项目根目录:

    export PYTHONPATH=/your/project/path # Linux/Mac 
    set PYTHONPATH=C:\your\project\path # Windows[3,6](@ref)
3. 配置文件 nb_log_config.py
# 关键配置项
DEFAULUT_USE_COLOR_HANDLER = True   # 控制台彩色输出
AUTO_PATCH_PRINT = True              # 增强print功能
LOG_FILE_SIZE = 200                  # 切割大小(MB)
LOG_FILE_BACKUP_COUNT = 5            # 备份文件数
LOG_FILE_HANDLER_TYPE = 1            # 多进程安全切割

三、参数详解与用法

1. 日志级别控制
参数 取值 级别 说明
log_level_int 10 DEBUG 最详细调试信息
20 INFO 常规操作信息
30 WARNING 潜在问题警告
40 ERROR 操作错误
50 CRITICAL 系统级错误

示例LogManager('api').log_level_int = 30 # 仅记录WARNING及以上

2. 文件日志参数
参数 默认值 说明
log_filename None 主日志文件名
error_log_filename None 错误日志独立文件
log_path "/pythonlogs" 日志存储目录
log_file_size 200(MB) 切割大小
log_file_backup_count 5 备份数量
3. 多目标输出参数
目标 参数 格式示例
钉钉 ding_talk_token 'dda1xxx'
邮件 mail_host+mail_user+mail_password SMTP配置
MongoDB mongo_url 'mongodb://user:pass@host:port'
Elasticsearch es_hosts ['http://user:pass@host:port']

四、场景化代码示例

1. 基础日志记录
logger = LogManager('core').get_logger_and_add_handlers(
    log_level_int=10,
    log_filename="app.log",
    error_log_filename="errors.log",
    log_file_size=200,
    log_file_handler_type=1
)

# print自动增强
print("用户登录")  # 输出:[app.py:25] 用户登录

# 分级记录
logger.debug("SQL: SELECT * FROM users")  # 控制台绿色
logger.info("用户A登录成功")             # 控制台蓝色
logger.error("数据库连接失败")           # 同时写入app.log和errors.log
2. 实时钉钉告警
alert_logger = LogManager('monitor').get_logger_and_add_handlers(
    ding_talk_token='dda1xxx',
    is_add_stream_handler=False,
    log_level_int=40
)

# 错误发生时
alert_logger.error("服务异常!CPU使用率95%", 
                   extra={'钉钉标题': '服务器紧急告警'})  # 推送钉钉
3. 多进程日志切割
from multiprocessing import Process

def worker(worker_id):
    logger = LogManager(f'worker_{worker_id}').get_logger_and_add_handlers(
        log_filename='task.log',
        log_file_handler_type=1  # 关键参数
    )
    for i in range(1000):
        logger.info(f"Worker {worker_id} 处理任务 {i}")

if __name__ == '__main__':
    procs = [Process(target=worker, args=(i,)) for i in range(8)]
    [p.start() for p in procs]
    [p.join() for p in procs]
4. 自定义日志格式
class CompactFormatter(logging.Formatter):
    def format(self, record):
        return f"{record.asctime} | {record.levelname:.1} | {record.msg}"

# 应用自定义格式
logger = LogManager('custom').get_logger_and_add_handlers(
    log_filename="custom.log"
)
for handler in logger.handlers:
    handler.setFormatter(CompactFormatter())

logger.info("精简格式测试")  # 输出:2025-07-16 14:30 | I | 精简格式测试

五、最佳实践指南

1. 环境差异化配置
# nb_log_config.py
import os

# 开发环境
if os.getenv('ENV') == 'dev':
    DEFAULUT_USE_COLOR_HANDLER = True
    AUTO_PATCH_PRINT = True
    LOG_LEVEL = 10  # DEBUG
    
# 生产环境
else:
    DEFAULUT_USE_COLOR_HANDLER = False
    LOG_LEVEL = 20  # INFO
    DING_TALK_TOKEN = 'dda1xxx'  # 全局钉钉配置
2. 模块化日志管理
# service_logger.py
from nb_log import LogManager

class ServiceLogger:
    def __init__(self, service_name):
        self.logger = LogManager(service_name).get_logger_and_add_handlers(
            error_log_filename=f"{service_name}_errors.log",
            log_file_handler_type=1
        )
    
    def critical_error(self, msg):
        self.logger.error(msg)
        # 可扩展:添加邮件/短信告警逻辑

# 使用示例
user_logger = ServiceLogger('user_service')
order_logger = ServiceLogger('order_service')
3. 高性能配置方案
# 10K+ QPS系统推荐配置
high_perf_logger = LogManager('gateway').get_logger_and_add_handlers(
    is_add_stream_handler=False,  # 关闭控制台
    log_filename='gateway.log',
    log_file_size=1024,  # 1GB切割
    log_file_handler_type=1,  # 多进程安全
    formatter_template=7  # 使用最简模板
)

六、故障排查手册

故障现象 诊断步骤 解决方案
配置文件未生成 检查Python路径 设置PYTHONPATH=/项目根目录
钉钉消息未发送 验证Token格式 使用完整Webhook Token(以dda1xxx开头)
日志重复记录 检查Handler数量 确保未混用原生logging添加额外Handler
权限拒绝错误 检查目录权限 Linux: chmod -R 777 /pythonlogs
Windows: 目录属性→安全→完全控制
多进程日志丢失 确认切割类型 设置log_file_handler_type=1
性能瓶颈 检查Handler数量 关闭控制台输出,使用最简日志模板

七、高级技巧

  1. 动态调整日志级别

  • # 运行时调整
    LogManager('api').log_level_int = 40  # 生产环境突发问题临时调高
  • 日志分级存储

  • # 将ERROR+日志单独存储
    LogManager('db').get_logger_and_add_handlers(
        error_log_filename='db_critical.log',
        error_log_level=40
    )
  • Kafka日志收集

    kafka_logger = LogManager('kafka').get_logger_and_add_handlers(
            kafka_bootstrap_servers=['kafka1:9092', 'kafka2:9092'],
            kafka_topic='app_logs'
        )

八、官方资源

终极提示:生产环境部署前务必测试日志切割功能,使用命令 logrotate -f /path/to/your/log.conf 验证切割配置可靠性。对于日均GB级日志系统,建议启用 log_file_handler_type=1 并配合ELK栈使用。







网站公告

今日签到

点亮在社区的每一天
去签到