实用日志记录模式
全面的日志记录装饰器
import functools
import logging
import time
import traceback
def advanced_logger(log_level=logging.INFO, log_args=True, log_exceptions=True):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logger = logging.getLogger(func.__module__)
## 记录函数入口
call_info = f"{func.__name__}("
if log_args:
arg_strings = [repr(a) for a in args]
arg_strings.extend(f"{k}={repr(v)}" for k, v in kwargs.items())
call_info += ", ".join(arg_strings)
call_info += ")"
logger.log(log_level, f"进入: {call_info}")
start_time = time.time()
try:
result = func(*args, **kwargs)
## 记录执行时间
execution_time = time.time() - start_time
logger.log(log_level, f"{func.__name__} 执行耗时 {execution_time:.4f} 秒")
return result
except Exception as e:
if log_exceptions:
logger.error(f"{func.__name__} 中发生异常: {str(e)}")
logger.error(traceback.format_exc())
raise
return wrapper
return decorator
日志记录模式可视化
graph TD
A[日志记录装饰器] --> B[函数入口日志记录]
A --> C[参数日志记录]
A --> D[执行时间跟踪]
A --> E[异常处理]
A --> F[可配置的日志级别]
常见日志记录用例
用例 |
描述 |
主要优点 |
性能监控 |
跟踪函数执行时间 |
识别瓶颈 |
调试 |
记录详细的函数调用 |
理解代码流程 |
错误跟踪 |
捕获并记录异常 |
改进错误处理 |
审计跟踪 |
记录函数调用 |
合规性和安全性 |
上下文感知日志记录
import contextvars
## 创建一个用于请求ID的上下文变量
request_id = contextvars.ContextVar('request_id', default='unknown')
def track_request(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
current_request_id = request_id.get()
logging.info(f"[请求 {current_request_id}] 调用 {func.__name__}")
return func(*args, **kwargs)
return wrapper
@track_request
def process_user_request(user_data):
## 处理请求逻辑
pass
## 为特定上下文设置请求ID
request_id.set('12345')
process_user_request({'用户': 'LabEx'})
日志记录配置最佳实践
import logging
import sys
def setup_logging():
## 创建一个自定义日志记录器
logger = logging.getLogger('LabEx')
logger.setLevel(logging.INFO)
## 创建处理器
console_handler = logging.StreamHandler(sys.stdout)
file_handler = logging.FileHandler('app.log')
## 创建格式化器
simple_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(simple_format)
file_handler.setFormatter(simple_format)
## 将处理器添加到日志记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
return logger
## 初始化日志记录
logger = setup_logging()
高级日志记录技术
- 结构化日志记录
- 日志轮转
- 远程日志记录
- 关联ID
- 性能日志记录
给LabEx开发者的建议
- 使用装饰器实现一致的日志记录
- 在应用程序启动早期配置日志记录
- 在详细日志记录和性能之间取得平衡
- 使用适当的日志级别
- 实施集中式日志记录策略
通过掌握这些实用的日志记录模式,你将使用LabEx创建更易于维护和可观察的Python应用程序。