文章目录
- import logging # 基础配置 logging.basicConfig( level=logging.INFO, format=’%(asctime)s – %(name)s – %(levelname)s – %(message)s’ ) # 使用示例 logger = logging.getLogger(__name__) logger.info(“用户登录成功”) # 输出:2023-07-20 14:30:00 – __main__ – INFO – 用户登录成功 痛点分析: 需要手动管理Handler和Formatter 多模块使用时配置复杂 缺乏开箱即用的高级功能
- from loguru import logger # 无需配置直接使用 logger.debug(“调试信息”) # 默认不显示 logger.success(“关键操作完成”) 核心优势: 预置美观的彩色输出格式 自动识别调用上下文 支持结构化日志 线程/异步安全设计
- # 将ERROR级日志单独保存 logger.add(“error.log”, level=”ERROR”, rotation=”10 MB”, filter=lambda record: record[“level”].name == “ERROR”)
- logger.add(“app_{time}.log”, rotation=”00:00″, # 每日轮转 retention=”30 days”, # 保留30天 compression=”zip”) # 自动压缩旧日志 轮转策略参数: rotation="500 MB":按文件大小 rotation="1 week":按时间周期 rotation=lambda _: True:每次启动时轮转
- @app.middleware(“http”) async def log_requests(request: Request, call_next): start_time = time.time() response = await call_next(request) logger.bind( path=request.url.path, method=request.method, status=response.status_code, latency=time.time() – start_time ).info(“API请求记录”) return response 输出示例: 2023-07-20 14:30:00 | INFO | __main__:log_requests:32 – API请求记录 path=/api/user method=GET status=200 latency=0.128s
- logger.add(“structured.log”, format=”{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}”, serialize=True) # 自动转为JSON格式
- def alert_on_critical(record): if record[“level”].name == “CRITICAL”: send_alert_email(record[“message”]) return True logger.add(alert_on_critical)
- # 对比日志库性能 def stress_test(): start = time.time() for _ in range(10000): logger.info(“压力测试消息”) print(f”耗时: {time.time()-start:.2f}s”) # 测试结果: # logging模块:1.34s # loguru:0.89s
- # 发送日志到ELK logger.add( lambda msg: requests.post(“http://elk:9200/logs”, json=msg), format=”{message}”, serialize=True )
目录
- 引言:为什么需要专业的日志管理?
- 一、基础模块对比:logging vs loguru
- 1.1 标准库logging基础用法
- 1.2 loguru的极简哲学
- 二、高级配置技巧
- 2.1 多级别日志分流
- 2.2 智能文件轮转策略
- 三、结构化日志实战
- 3.1 Web请求日志案例
- 3.2 JSON格式输出
- 四、高级过滤与上下文管理
- 4.1 动态日志过滤
- 4.2 上下文绑定
- 五、企业级应用实践
- 5.1 日志报警触发器
- 5.2 性能优化测试
- 5.3 分布式日志聚合
- 六、最佳实践指南
- 结语
在软件工程实践中,日志系统是系统的"黑匣子",它记录了应用程序运行时的关键信息。优秀的日志实践能:
- 快速定位生产环境故障
- 分析系统性能瓶颈
- 满足审计合规要求
- 支撑用户行为分析
Python标准库的logging模块功能强大但配置复杂,而第三方库loguru通过创新的API设计大幅降低了日志管理门槛。本文将深入对比两者差异,并演示loguru在现代应用中的高级实践。
import logging
# 基础配置
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 使用示例
logger = logging.getLogger(__name__)
logger.info("用户登录成功") # 输出:2023-07-20 14:30:00 - __main__ - INFO - 用户登录成功
痛点分析:
- 需要手动管理Handler和Formatter
- 多模块使用时配置复杂
- 缺乏开箱即用的高级功能
from loguru import logger
# 无需配置直接使用
logger.debug("调试信息") # 默认不显示
logger.success("关键操作完成")
核心优势:
- 预置美观的彩色输出格式
- 自动识别调用上下文
- 支持结构化日志
- 线程/异步安全设计
# 将ERROR级日志单独保存
logger.add("error.log",
level="ERROR",
rotation="10 MB",
filter=lambda record: record["level"].name == "ERROR")
logger.add("app_{time}.log",
rotation="00:00", # 每日轮转
retention="30 days", # 保留30天
compression="zip") # 自动压缩旧日志
轮转策略参数:
- rotation="500 MB":按文件大小
- rotation="1 week":按时间周期
- rotation=lambda _: True:每次启动时轮转
@app.middleware("http")
async def log_requests(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
logger.bind(
path=request.url.path,
method=request.method,
status=response.status_code,
latency=time.time() - start_time
).info("API请求记录")
return response
输出示例:
2023-07-20 14:30:00 | INFO | __main__:log_requests:32 – API请求记录
path=/api/user method=GET status=200 latency=0.128s
logger.add("structured.log",
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
serialize=True) # 自动转为JSON格式
def development_only(record):
return record["extra"].get("env") == "dev"
logger.add("dev.log", filter=development_only)
# 在请求生命周期中保持上下文
context_logger = logger.bind(request_id=uuid.uuid4())
context_logger.info("开始处理请求")
def alert_on_critical(record):
if record["level"].name == "CRITICAL":
send_alert_email(record["message"])
return True
logger.add(alert_on_critical)
# 对比日志库性能
def stress_test():
start = time.time()
for _ in range(10000):
logger.info("压力测试消息")
print(f"耗时: {time.time()-start:.2f}s")
# 测试结果:
# logging模块:1.34s
# loguru:0.89s
# 发送日志到ELK
logger.add(
lambda msg: requests.post("http://elk:9200/logs", json=msg),
format="{message}",
serialize=True
)
1.日志分级策略:
- DEBUG:开发调试细节
- INFO:关键业务流程节点
- WARNING:可恢复的异常
- ERROR:需要干预的故障
- CRITICAL:系统级故障
2.安全注意事项:
# 敏感信息过滤
def sanitize(record):
if "password" in record["message"]:
record["message"] = record["message"].replace(..., "***")
return True
logger = logger.patch(sanitize)
3.性能优化建议:
- 避免在热路径中进行字符串格式化
- 合理设置日志级别
- 使用异步日志处理器
练习题与思考
- 实现一个当日志错误率超过10%时触发短信报警的监控系统
- 设计支持百万QPS的日志收集方案
- 比较loguru与ELK、Fluentd等系统的集成方式
loguru通过创新的API设计,让Python日志管理变得优雅而强大。但在企业级应用中,需要结合具体场景选择日志架构。建议在中小型项目中使用loguru快速搭建日志系统,在大型分布式系统中结合专业的日志平台构建完整解决方案。
到此这篇关于Python日志记录与loguru高级用法全解析的文章就介绍到这了,更多相关Python loguru日志内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python中loguru日志库的使用
- Python 日志管理模块Loguru的用法小结
- Python3 Loguru输出日志工具的使用
- Python 第三方日志框架loguru使用
- python第三方异步日志库loguru简介
- python日志模块loguru详解