前言
python 的 logging
模块是标准库中用于记录日志的核心工具,通过灵活配置可实现多级别、多目标、多格式的日志管理。以下是其核心用法及详细说明:
功能说明
一、logger 的创建与基础配置
创建 logger 实例使用
logging.getlogger(name)
创建或获取一个 logger 对象。若未指定名称,默认返回根 logger(root
)。import logging logger = logging.getlogger('my_app') # 创建名为 'my_app' 的 logger
设置日志级别logger 的级别决定其处理的最低日志等级,可选级别从低到高为:
debug
、info
、warning
、error
、critical
。logger.setlevel(logging.debug) # 记录 debug 及以上级别的日志
默认级别与继承关系
- 若未显式设置级别,logger 会继承父级(如
root
)的级别,默认warning
。 - logger 名称支持层级结构(如
a.b
继承a
的配置),便于模块化日志管理。
- 若未显式设置级别,logger 会继承父级(如
二、handler 的配置与使用
handler 负责将日志发送到不同目标(如文件、控制台),可同时添加多个 handler 实现多路输出。
常用 handler 类型
handler | 功能 | 示例 |
---|---|---|
streamhandler | 输出到控制台(默认 sys.stderr ) | logging.streamhandler() |
filehandler | 输出到文件 | logging.filehandler('app.log', mode='a') |
rotatingfilehandler | 日志文件按大小回滚(避免文件过大) | from logging.handlers import rotatingfilehandler |
timedrotatingfilehandler | 按时间回滚日志文件(如每天生成新文件) | from logging.handlers import timedrotatingfilehandler |
示例:同时输出到文件和控制台
# 文件 handler(按大小回滚) from logging.handlers import rotatingfilehandler file_handler = rotatingfilehandler( 'app.log', maxbytes=1024*1024, backupcount=5 # 单个文件最大1mb,保留5个备份 ) file_handler.setlevel(logging.info) # 控制台 handler console_handler = logging.streamhandler() console_handler.setlevel(logging.debug) # 添加 handler 到 logger logger.addhandler(file_handler) logger.addhandler(console_handler)
三、formatter 自定义日志格式
通过 formatter
可定义日志输出的格式,支持占位符如 %(asctime)s
(时间)、%(levelname)s
(级别)、%(message)s
(消息)等。
formatter = logging.formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%y-%m-%d %h:%m:%s' # 自定义时间格式 ) file_handler.setformatter(formatter) console_handler.setformatter(formatter)
四、记录不同级别的日志
通过 logger 对象调用对应级别的方法记录日志:
logger.debug('调试信息,用于开发阶段追踪细节') # 仅当 logger 级别 ≤ debug 时输出 logger.info('常规信息,如服务启动') logger.warning('潜在问题警告,如参数缺失') logger.error('程序错误,但应用仍可运行') logger.critical('严重错误,可能导致程序崩溃')
五、高级配置与最佳实践
全局配置快速启动使用
logging.basicconfig()
快速配置根 logger,适合简单场景:logging.basicconfig( level=logging.info, format='%(asctime)s - %(message)s', handlers=[logging.filehandler('app.log'), logging.streamhandler()] )
过滤器(filter)通过
filter
实现更精细的日志筛选,例如仅记录特定模块或包含关键字的日志:class customfilter(logging.filter): def filter(self, record): return 'important' in record.getmessage() # 仅记录含 'important' 的日志 logger.addfilter(customfilter())
避免重复日志若 logger 层级配置不当,可能导致日志重复输出。建议在子 logger 中禁用传播到父级:
child_logger = logging.getlogger('my_app.sub_module') child_logger.propagate = false # 阻止日志传递给父 logger
六、常见问题与调试
- 日志不显示:检查 logger 和 handler 的级别是否高于日志调用级别。
- 多 handler 冲突:确保每个 handler 的级别和 formatter 独立配置。
- 性能优化:高频日志场景可使用
rotatingfilehandler
避免文件过大,或异步日志库(如concurrent-log-handler
)。
以下是 python 中 logging
模块的详细使用教程,涵盖基础配置、高级用法及最佳实践,结合多篇权威资料整理而成:
使用方法
一、基础配置与快速使用
引入模块与基础配置通过
basicconfig()
函数快速配置全局日志参数:import logging logging.basicconfig( level=logging.debug, # 设置最低日志级别为 debug format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%y-%m-%d %h:%m:%s', # 时间格式 filename='app.log', # 输出到文件(默认追加模式) filemode='w' # 覆盖模式写入文件(可选) )
记录不同级别的日志使用预定义的日志级别方法输出信息:
logging.debug('调试信息') # 开发阶段追踪细节 logging.info('常规状态') # 程序正常运行信息 logging.warning('潜在问题') # 如参数缺失或兼容性问题 logging.error('错误事件') # 功能异常但程序仍运行 logging.critical('严重故障') # 系统可能崩溃的致命错误
注意:只有不低于
level
参数设置的级别才会被记录。
二、自定义 logger 对象
创建独立 logger推荐为不同模块创建独立 logger 以分类管理日志:
logger = logging.getlogger('my_module') # 名称建议使用模块名 logger.setlevel(logging.info) # 覆盖全局级别
添加处理器(handler)支持同时输出到控制台、文件、网络等多种目标:
# 控制台处理器 console_handler = logging.streamhandler() console_handler.setlevel(logging.debug) # 文件处理器(按大小轮转) from logging.handlers import rotatingfilehandler file_handler = rotatingfilehandler( 'app.log', maxbytes=10*1024*1024, backupcount=5 # 10mb/文件,保留5个备份 ) file_handler.setlevel(logging.error) # 将处理器附加到 logger logger.addhandler(console_handler) logger.addhandler(file_handler)
自定义日志格式通过
formatter
定义日志输出样式:formatter = logging.formatter( '%(asctime)s [%(levelname)s] %(module)s:%(lineno)d - %(message)s', datefmt='%h:%m:%s' ) console_handler.setformatter(formatter) file_handler.setformatter(formatter)
三、高级用法
配置文件管理使用
.conf
或.ini
文件分离配置(推荐大型项目):import logging.config logging.config.fileconfig('logging.conf')
示例 logging.conf 内容:
[loggers] keys=root,my_app [handlers] keys=consolehandler,filehandler [formatters] keys=simpleformatter [logger_root] level=debug handlers=consolehandler [logger_my_app] level=info handlers=filehandler qualname=my_app propagate=0 # 禁止传播到父级 logger
日志传播控制通过
propagate
属性控制是否向父级 logger 传递日志:child_logger = logging.getlogger('parent.child') child_logger.propagate = false # 仅当前 logger 处理日志
过滤器(filter)实现精细化日志筛选:
class keywordfilter(logging.filter): def __init__(self, keyword): super().__init__() self.keyword = keyword def filter(self, record): return self.keyword in record.getmessage() logger.addfilter(keywordfilter('重要'))
四、最佳实践与注意事项
性能优化
- 避免高频日志调用:使用
isenabledfor()
检查级别后再记录:if logger.isenabledfor(logging.debug): logger.debug(f'耗时计算: {expensive_function()}')
- 使用异步日志库(如
concurrent-log-handler
)处理高并发场景。
- 避免高频日志调用:使用
多环境配置根据运行环境动态调整配置:
if os.getenv('env') == 'production': logger.setlevel(logging.warning) else: logger.setlevel(logging.debug)
错误处理为关键操作添加异常捕获并记录堆栈:
try: risky_operation() except exception as e: logger.exception('操作失败: %s', e) # 自动记录堆栈跟踪
五、实际应用场景示例
网络请求监控:
import requests def fetch_data(url): try: response = requests.get(url, timeout=5) response.raise_for_status() logger.info(f'成功获取 {url} 数据') return response.json() except requests.requestexception as e: logger.error(f'请求失败: {url} - {str(e)}') return none
通过合理配置 logger、handler 和 formatter,可以构建灵活高效的日志系统。更多高级功能(如远程日志、邮件通知)可参考 python 官方文档。
总结
到此这篇关于python中logger包详细使用的文章就介绍到这了,更多相关python logger包使用教程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论