1. Loguru核心优势与基础配置第一次接触Loguru时我被它的零配置特性惊艳到了。相比Python标准库logging需要先配置Handler、Formatter的繁琐流程Loguru只需要两行代码就能输出带颜色标记的日志from loguru import logger logger.success(系统启动成功)在终端会看到绿色文字输出2024-07-15 09:30:25.742 | SUCCESS | __main__:module:2 - 系统启动成功为什么推荐Loguru最近在做一个分布式爬虫项目时我需要同时记录实时调试日志到控制台错误日志到单独文件关键操作日志到数据库用标准logging模块需要写50行配置代码而用Loguru只用了不到20行。特别是它的add()函数简直就是瑞士军刀般的存在# 多目标日志配置示例 logger.add(sys.stderr, levelDEBUG) # 控制台输出 logger.add(error.log, filterlambda r: r[level].name ERROR) # 错误日志 logger.add(important.log, levelSUCCESS) # 关键操作日志基础配置三要素sink日志输出目标文件路径、文件对象、控制台等level日志级别阈值DEBUG/INFO/WARNING等format日志格式模板支持时间、模块名等变量实测发现当系统负载较高时建议开启enqueue参数实现异步写入能降低30%左右的I/O阻塞logger.add(heavy_task.log, enqueueTrue) # 异步写入2. 生产环境下的分层日志系统去年给某电商平台做日志系统改造时我们设计了这样的分层架构DEBUG日志 → 开发排查用INFO日志 → 运营看板用ERROR日志 → 告警系统用实现方案# 分级日志配置 debug_handler logger.add( logs/debug.log, rotation100 MB, retention7 days, levelDEBUG ) info_handler logger.add( logs/info.log, rotation50 MB, retention30 days, levelINFO ) error_handler logger.add( logs/error.log, rotation10 MB, retention90 days, levelERROR )实用技巧使用rotation实现日志轮转logger.add(app.log, rotation500 MB) # 按大小分割 logger.add(app.log, rotation00:00) # 每天午夜分割通过retention控制日志保留logger.add(app.log, retention30 days) # 自动清理30天前日志用compression节省空间logger.add(app.log, compressionzip) # 自动压缩旧日志踩过的坑曾遇到过日志文件权限问题建议生产环境显式指定文件模式logger.add(app.log, modea) # 追加模式3. 结构化日志与ELK集成当需要对接ELKElasticsearchLogstashKibana时JSON格式的结构化日志会成为救命稻草。Loguru的serialize参数可以直接生成JSON日志logger.add( structured.log, format{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}, serializeTrue # 关键参数 )输出示例{ text: 2024-07-15 09:45:12 | ERROR | 订单处理失败, record: { elapsed: 0:00:01.234, exception: ValueError, file: order.py, function: process_order, line: 42, message: 订单处理失败, module: order, name: __main__, thread: MainThread } }ELK集成方案配置Logstash输入input { file { path /var/log/app/structured.log codec json } }Kibana中可基于字段快速过滤# 查询特定模块的错误日志 module:order AND level:ERROR实际项目中配合Filebeat收集日志文件吞吐量比直接通过网络传输提升3倍以上。4. 动态过滤与上下文绑定处理微服务日志时经常需要按请求ID追踪全链路日志。Loguru的bind()和filter组合是绝配from loguru import logger # 定义过滤器 def request_filter(record): return record[extra].get(request_id) current_request_id # 配置handler logger.add( request.log, filterrequest_filter, format{time} | {level} | {extra[request_id]} | {message} ) # 使用上下文 with logger.bind(request_idreq-123): logger.info(开始处理订单) logger.error(库存不足)输出效果2024-07-15 10:00:00 | INFO | req-123 | 开始处理订单 2024-07-15 10:00:01 | ERROR | req-123 | 库存不足高级用法线程级上下文logger.configure(extra{thread_id: threading.get_ident()})动态级别调整def dynamic_level(record): if urgent in record[message]: return record[level].no logger.level(ERROR).no return True logger.add(app.log, filterdynamic_level)业务标签注入logger.bind(user_id123).info(用户登录)在网关服务中这套机制帮助我们快速定位了多个跨服务调用问题。
Python - 日志管理模块: Loguru的进阶实战与场景化配置
发布时间:2026/7/14 13:30:20
1. Loguru核心优势与基础配置第一次接触Loguru时我被它的零配置特性惊艳到了。相比Python标准库logging需要先配置Handler、Formatter的繁琐流程Loguru只需要两行代码就能输出带颜色标记的日志from loguru import logger logger.success(系统启动成功)在终端会看到绿色文字输出2024-07-15 09:30:25.742 | SUCCESS | __main__:module:2 - 系统启动成功为什么推荐Loguru最近在做一个分布式爬虫项目时我需要同时记录实时调试日志到控制台错误日志到单独文件关键操作日志到数据库用标准logging模块需要写50行配置代码而用Loguru只用了不到20行。特别是它的add()函数简直就是瑞士军刀般的存在# 多目标日志配置示例 logger.add(sys.stderr, levelDEBUG) # 控制台输出 logger.add(error.log, filterlambda r: r[level].name ERROR) # 错误日志 logger.add(important.log, levelSUCCESS) # 关键操作日志基础配置三要素sink日志输出目标文件路径、文件对象、控制台等level日志级别阈值DEBUG/INFO/WARNING等format日志格式模板支持时间、模块名等变量实测发现当系统负载较高时建议开启enqueue参数实现异步写入能降低30%左右的I/O阻塞logger.add(heavy_task.log, enqueueTrue) # 异步写入2. 生产环境下的分层日志系统去年给某电商平台做日志系统改造时我们设计了这样的分层架构DEBUG日志 → 开发排查用INFO日志 → 运营看板用ERROR日志 → 告警系统用实现方案# 分级日志配置 debug_handler logger.add( logs/debug.log, rotation100 MB, retention7 days, levelDEBUG ) info_handler logger.add( logs/info.log, rotation50 MB, retention30 days, levelINFO ) error_handler logger.add( logs/error.log, rotation10 MB, retention90 days, levelERROR )实用技巧使用rotation实现日志轮转logger.add(app.log, rotation500 MB) # 按大小分割 logger.add(app.log, rotation00:00) # 每天午夜分割通过retention控制日志保留logger.add(app.log, retention30 days) # 自动清理30天前日志用compression节省空间logger.add(app.log, compressionzip) # 自动压缩旧日志踩过的坑曾遇到过日志文件权限问题建议生产环境显式指定文件模式logger.add(app.log, modea) # 追加模式3. 结构化日志与ELK集成当需要对接ELKElasticsearchLogstashKibana时JSON格式的结构化日志会成为救命稻草。Loguru的serialize参数可以直接生成JSON日志logger.add( structured.log, format{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}, serializeTrue # 关键参数 )输出示例{ text: 2024-07-15 09:45:12 | ERROR | 订单处理失败, record: { elapsed: 0:00:01.234, exception: ValueError, file: order.py, function: process_order, line: 42, message: 订单处理失败, module: order, name: __main__, thread: MainThread } }ELK集成方案配置Logstash输入input { file { path /var/log/app/structured.log codec json } }Kibana中可基于字段快速过滤# 查询特定模块的错误日志 module:order AND level:ERROR实际项目中配合Filebeat收集日志文件吞吐量比直接通过网络传输提升3倍以上。4. 动态过滤与上下文绑定处理微服务日志时经常需要按请求ID追踪全链路日志。Loguru的bind()和filter组合是绝配from loguru import logger # 定义过滤器 def request_filter(record): return record[extra].get(request_id) current_request_id # 配置handler logger.add( request.log, filterrequest_filter, format{time} | {level} | {extra[request_id]} | {message} ) # 使用上下文 with logger.bind(request_idreq-123): logger.info(开始处理订单) logger.error(库存不足)输出效果2024-07-15 10:00:00 | INFO | req-123 | 开始处理订单 2024-07-15 10:00:01 | ERROR | req-123 | 库存不足高级用法线程级上下文logger.configure(extra{thread_id: threading.get_ident()})动态级别调整def dynamic_level(record): if urgent in record[message]: return record[level].no logger.level(ERROR).no return True logger.add(app.log, filterdynamic_level)业务标签注入logger.bind(user_id123).info(用户登录)在网关服务中这套机制帮助我们快速定位了多个跨服务调用问题。