Python logging模块使用详解:从基础配置到高级应用

Ada
Ada
发布时间:2026-10-13 | 3人浏览过
原创

本文深入解析Python标准库logging模块的核心用法。涵盖DEBUG至CRITICAL五级日志定义,演示控制台与文件输出的配置方法,讲解命令行参数动态调整日志级别、变量格式化及自定义输出模板。进一步介绍Logger、Handler、Filter和Formatter组件协作机制,并提供支持滚动保存近15天日志的自定义处理类实现案例,帮助开发者构建完善的日志监控体系。

日志模块用于记录程序运行期间的状态信息。在开发阶段集成日志功能,有助于追踪程序执行过程中发生的具体事件,并区分这些事件的严重程度。

依据事件的重要程度,日志通常划分为以下等级:

DEBUG:提供详细信息,通常仅在排查故障时启用。对应整数level=10

INFO:确认程序正按预期正常运行。对应整数level=20

WARNING:出现异常状况,但程序仍可继续正常工作。对应整数level=30

ERROR:因特定原因导致程序部分功能无法执行。对应整数level=40

CRITICAL:发生严重错误,致使程序无法继续运行。对应整数level=50

系统默认日志级别为WARNING,这意味着仅记录级别大于或等于该值的日志。日志追踪方式支持写入文件或直接输出至控制台。

将日志输出至控制台

以下示例展示了如何将日志直接输出到控制台:

import logging
logging.warning('Watch out!') # 将输出到控制台
logging.info('I told you so') # 不会输出
logging.error("an error occurrence!") #将输出到控制台

控制台输出结果如下:

WARNING:root:Watch out!
ERROR:root:an error occurrence

将日志保存至文件

需启动新的Python解释器实例,确保不与前文代码共享同一会话状态。

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

此时控制台不再显示日志输出,而文件example.log中记录了以下内容:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

若需手动调整日志级别,可通过命令行传入参数--log=INFO。在代码层面,可采用如下方式处理该参数:

# 输入参数 --log=DEBUG or --log=debug
numeric_level = getattr(logging, loglevel.upper(), None)#返回10,否则None
if not isinstance(numeric_level, int):
 raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level, ...)

记录变量值的日志

利用格式化字符串语法,为日志内容添加变量信息:

import logging
logging.warning('%s before you %s', 'Look', 'leap!')

自定义日志输出格式

根据实际需求,我们可以自定义日志输出的模板样式:

import logging
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

最终输出效果如下:

2017-10-24 14:03:53,671: DEBUG: This message should appear on the console
2017-10-24 14:03:53,690: INFO: So should this
2017-10-24 14:03:53,694: WARNING: And this, too

底层实现中传入的是一个字典对象,其中%(key)代表字典的键名。

上述内容涵盖了Python logging模块的基础用法,已能满足多数常规需求。接下来简要介绍logging的高级配置。该模块主要包含四个核心组件:logger、handlers、filter和formatters。

logger:提供应用程序接口供代码调用。 handlers:负责将logger生成的日志发送至指定目的地。 filter:为输出日志提供更精细的过滤设置。 formatters:定义最终的日志输出格式。

以下是各组件协同工作的示例代码:

import logging
logger = logging.getLogger('logger_name')# 创建logger对象
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()# 创建 console handler 并设置级别为debug
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 创建输出格式
handler.setFormatter(formatter)# 为handler添加fromatter
logger.addHandler(handler)# 将handler添加到 logger
logger.debug('debug message')# 'application' code
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

执行后产生的输出结果如下:

2017-10-24 16:50:43,127 - logger_name - DEBUG - debug message 2017-10-24 16:50:43,138 - logger_name - INFO - info message 2017-10-24 16:50:43,141 - logger_name - WARNING - warn message 2017-10-24 16:50:43,144 - logger_name - ERROR - error message 2017-10-24 16:50:43,148 - logger_name - CRITICAL - critical message

实际应用场景案例

下面展示一个自定义日志处理类的实现,该功能既能将日志写入文件(采用滚动策略保存最近15天的日志,文件名格式为app.log, app.log.1, app.log.2),又能同时输出到控制台。

import logging
from logging.handlers import TimedRotatingFileHandler
class MylogHandler(logging.Logger):
 def __init__(self,name,level="DEBUG",stream=True,files=True):
  self.name = name
  self.level = level
  logging.Logger.__init__(self,self.name,level=self.level)
  if stream:
   self.__streamHandler__(self.level)
  if files:
   self.__filesHandler__(self.level)
 def __streamHandler__(self,level=None):
  handler = TimedRotatingFileHandler(filename=self.name+".log", when='D', interval=1, backupCount=15)
  handler.suffix = '%Y%m%d.log'
  handler.setLevel(level)
  formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  handler.setFormatter(formatter)
  self.addHandler(handler) #将hander添加到logger上
 def __filesHandler__(self,level=None):
  handler = logging.StreamHandler()
  formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  handler.setFormatter(formatter)
  handler.setLevel(level)
  self.addHandler(handler)
if __name__ == '__main__':
 log = MylogHandler('test')
 log.info('this is a my log handler')

总结

以上内容为Python中logging模块的使用详解,希望能对大家有所帮助。如有任何疑问欢迎留言,小编会及时回复。感谢大家对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表