Python日志系统logging模块详解
Python中的logging模块:构建灵活的日志记录机制
在开发过程中,追踪程序运行状态和排查问题是必不可少的环节。Python内置的logging模块提供了一个功能强大且可扩展的日志处理框架,能够帮助开发者高效地记录应用程序的行为。
日志级别
该模块定义了五个标准的日志等级,按严重性递增排列:
- DEBUG:用于调试信息
- INFO:常规运行信息
- WARNING:警告情况,不影响正常执行
- ERROR:错误事件,部分功能可能失败
- CRITICAL:严重错误,可能导致程序中断
核心组件结构
1. Logger(日志生成器)
Logger是日志系统的入口点,负责创建日志消息。通过名称获取独立的logger实例:
logger = logging.getLogger('app.network')
随后可以调用其方法输出不同级别的日志:
logger.debug("连接开始尝试")
logger.warning("响应时间超过阈值")
logger.error("数据库连接失败")
2. Handler(输出处理器)
Handler决定日志消息的去向。常见的类型包括:
# 输出到控制台
console_handler = logging.StreamHandler()
# 写入文件
file_handler = logging.FileHandler('app.log', encoding='utf-8')
# 按大小轮转的日志文件
rotating_handler = logging.handlers.RotatingFileHandler(
'app.log',
maxBytes=5*1024*1024, # 5MB
backupCount=3
)
3. Formatter(格式化器)
Formatter定义日志的最终输出样式。支持多种占位符来自定义内容:
basic_format = logging.Formatter(
fmt='[{asctime}] [{levelname}] [{name}] {message}',
datefmt='%Y-%m-%d %H:%M:%S',
style='{'
)
detailed_format = logging.Formatter(
fmt='[{asctime}] [{levelname}] [{filename}:{lineno}] {message}',
datefmt='%Y-%m-%d',
style='{'
)
常用格式字段说明:
{name} | Logger的名称 |
{levelname} | 日志级别文本(如 ERROR) |
{asctime} | 时间戳 |
{filename} | 源文件名 |
{lineno} | 代码行号 |
{funcName} | 函数名 |
{message} | 用户输入的消息内容 |
4. 组件关联配置
将上述元素组合起来才能形成完整的日志链路:
# 设置格式
console_handler.setFormatter(basic_format)
file_handler.setFormatter(detailed_format)
# 绑定处理器到logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 设定最低捕获级别
logger.setLevel(logging.DEBUG)
使用字典配置集中管理
对于复杂项目,推荐使用字典方式统一配置整个日志系统:
import logging.config
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '[{asctime}][{levelname}][{name}][{filename}:{lineno}]{message}',
'style': '{'
},
'brief': {
'format': '[{levelname}] {message}',
'style': '{'
}
},
'handlers': {
'console_out': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'brief',
'stream': 'ext://sys.stdout'
},
'file_out': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'DEBUG',
'formatter': 'standard',
'filename': 'runtime.log',
'maxBytes': 10485760, # 10 MB
'backupCount': 5,
'encoding': 'utf-8'
}
},
'loggers': {
'default': {
'level': 'DEBUG',
'handlers': ['console_out', 'file_out'],
'propagate': False
},
'security': {
'level': 'WARNING',
'handlers': ['file_out'],
'propagate': False
}
},
'root': {
'level': 'INFO',
'handlers': ['console_out']
}
}
# 应用配置
logging.config.dictConfig(LOGGING_CONFIG)
# 获取指定logger并使用
app_logger = logging.getLogger('default')
sec_logger = logging.getLogger('security')
app_logger.info("应用启动成功")
sec_logger.warning("检测到异常登录尝试")
这种集中式配置方式便于维护,并可在多个环境中快速切换不同的日志策略。
