Python logging模块核心用法与配置详解
本文系统梳理Python内置logging模块的核心功能,详解CRITICAL至DEBUG五级日志的适用场景与默认行为。通过basicConfig函数演示控制台与文件输出的配置方法,包括格式定制、文件名管理及日志轮转策略。结合代码示例展示如何记录程序异常堆栈信息,帮助开发者实现生产环境下的精细化日志管理。
前言
logging模块作为Python标准库的重要组成部分,主要用于生成脚本运行时的日志信息。开发者可通过该模块灵活配置日志输出的等级阈值、存储路径及格式规范,从而满足不同的调试与审计需求。
- 通过设定不同的日志记录等级,可以在发布版本中仅保留关键信息,而过滤掉大量用于调试的细节数据,从而提升生产环境的运行效率。
- 该模块允许开发者精确控制日志信息的输出目标(如控制台或文件)以及具体的内容格式,实现灵活的信息展示。
- logging模块在设计上具备线程安全特性,能够支持多线程环境下的并发日志写入操作,无需额外加锁即可保证数据一致性。
一、日志级别
日志严重性排序从高到低依次为:CRITICAL(严重错误) > ERROR(错误) > WARNING(警告) > INFO(一般信息) > DEBUG(调试信息)。
- DEBUG级别用于输出最详尽的日志信息,通常仅在排查具体问题时启用,包含程序运行的详细步骤与变量状态。
- INFO级别用于记录正常的程序运行流程,包括INFO、WARNING、ERROR及CRITICAL级别的日志,适用于常规业务监控。
- WARNING级别用于记录部分异常或潜在风险,此类问题通常不影响程序主体的继续运行,但需引起注意。
- ERROR级别用于记录导致程序部分功能失效的错误,这类日志表明程序已发生异常,需及时介入处理。
- CRITICAL级别用于记录导致程序完全无法运行的致命错误,属于最高优先级的日志信息。
import logging # 引入logging模块
# 将信息打印到控制台上
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
[root@zijie ~]# python log.py
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
默认创建的根记录器(root logger)级别设置为logging.WARNING,低于该级别的日志将不会输出。若需展示低于WARNING级别的日志内容,可通过调用logging.basicConfig函数并指定level=logging.DEBUG参数来调整日志级别。
二、basicConfig
| 格式 | 描述 |
| filename | 指定使用指定的文件名而不是 StreamHandler 创建 FileHandler。 |
| filemode | 如果指定 filename,则以此模式打开文件(‘r'、‘w'、‘a')。默认为“a”。 |
| format | 为处理程序使用指定的格式字符串。 |
| datefmt | 使用 time.strftime() 所接受的指定日期/时间格式。 |
| style | 如果指定了格式,则对格式字符串使用此样式。'%' 用于 printf 样式、'{' 用于 str.format()、'$' 用于 string。默认为“%”。 |
| level | 将根记录器级别设置为指定的级别。默认生成的 root logger 的 level 是 logging.WARNING,低于该级别的就不输出了。级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。(如果需要显示所有级别的内容,可将 level=logging.NOTSET) |
| stream | 使用指定的流初始化 StreamHandler。注意,此参数与 filename 不兼容——如果两者都存在,则会抛出 ValueError。 |
| handlers | 如果指定,这应该是已经创建的处理程序的迭代,以便添加到根日志程序中。任何没有格式化程序集的处理程序都将被分配给在此函数中创建的默认格式化程序。注意,此参数与 filename 或 stream 不兼容——如果两者都存在,则会抛出 ValueError。 |
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s %(levelname)s %(message)s',
datefmt='%a %d %b %Y %H:%M:%S',
filename='xuehui.log',
filemode='w')
logging.info('This is a info.')
logging.debug('This is a debug message.')
logging.warning('This is a warning.')
三、日志写文件
import logging
import os.path
import time
#创建logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建handler,用于写入日志文件
logdate = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
log_path = 'logs/'
log_name = log_path + logdate + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG)
# 定义输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 将logger添加到handler
logger.addHandler(fh)
# 日志
logger.debug('this is a logger debug message')
logger.info('this is a logger info message')
logger.warning('this is a logger warning message')
logger.error('this is a logger error message')
logger.critical('this is a logger critical message')
四、traceback记录
import logging
import os.path
import time
#创建logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建handler,用于写入日志文件
logdate = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
log_path = 'logs/'
log_name = log_path + logdate + '.log'
logfile = log_name
fh = logging.FileHandler(logfile, mode='w')
fh.setLevel(logging.DEBUG)
# 定义输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
# 将logger添加到handler
logger.addHandler(fh)
# 日志
try:
open('/data/exist', 'rb')
except BaseException as e:
logger.error('Failed to open file', exc_info=True)
至此,关于Python基础logging模块的核心知识已介绍完毕。如需了解更多Python logging模块相关内容,建议查阅本站过往文章或继续浏览后续教程,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













