Python logging模块基础配置与高级用法详解
本文详细介绍Python内置logging模块的使用方法。涵盖默认行为解析,通过basicConfig函数灵活配置日志级别、格式及输出位置。深入讲解RotatingFileHandler和TimedRotatingFileHandler实现日志切割,以及利用Logger、Handler、Formatter组合进行精细化日志控制,帮助开发者构建规范的日志系统。
Python logging模块默认行为解析
在默认情况下,Python的logging模块会将日志信息输出至标准输出流,且仅展示WARNING级别及以上的日志记录。这一行为表明,系统默认的日志阈值被设定为WARNING(日志级别从高到低依次为CRITICAL、ERROR、WARNING、INFO、DEBUG)。同时,默认的日志输出格式遵循“日志级别:Logger名称:用户输出消息”的结构。
灵活配置日志级别、格式与输出位置
为了实现更高效的日志管理,开发者需要掌握如何灵活配置日志级别、定义日志输出格式以及指定日志存储位置。
基础日志文件配置示例
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler,],
level=logging.ERROR
)
logging.error('你好')
日志切割策略与实现
随着应用运行时间的增长,日志文件体积会不断膨胀。因此,实施日志切割策略至关重要,它允许按时间或文件大小自动轮转日志文件,确保存储资源的有效利用。
日志切割高级配置示例
import time
import logging
from logging import handlers
sh = logging.StreamHandler()
rh = handlers.RotatingFileHandler('myapp.log', maxBytes=1024,backupCount=5)
fh = handlers.TimedRotatingFileHandler(filename='x2.log', when='s', interval=5, encoding='utf-8')
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[fh,sh,rh],
level=logging.ERROR
)
for i in range(1,100000):
time.sleep(1)
logging.error('KeyboardInterrupt error %s'%str(i))
logging模块提供了丰富的配置参数,允许开发者根据具体需求调整日志行为。
通过调用logging.basicConfig()函数,可以修改logging模块的默认行为。该函数支持以下关键参数:
filename:指定生成日志文件的文件名,系统将创建FileHandler并将日志写入该文件。filemode:定义文件打开模式,仅在指定filename时生效,默认为追加模式“a”,也可设置为覆盖写入“w”。format:指定日志记录的格式字符串。datefmt:定义日期时间的显示格式。level:设置rootlogger的最低日志级别。stream:指定输出流,如sys.stderr、sys.stdout或已打开的文件对象,默认为sys.stderr。注意,若同时提供filename和stream参数,stream将被忽略。
在format字符串中,可使用以下预定义变量来定制日志内容: %(name)s:Logger的名称。 %(levelno)s:以数字形式表示的日志级别。 %(levelname)s:以文本形式表示的日志级别(如DEBUG, INFO等)。 %(pathname)s:调用日志输出函数的模块的完整路径名,若不可用则缺失。 %(filename)s:调用日志输出函数的模块文件名。 %(module)s:调用日志输出函数的模块名。 %(funcName)s:调用日志输出函数的函数名。 %(lineno)d:调用日志输出语句所在的代码行号。 %(created)f:当前时间,以UNIX标准时间戳(浮点数)表示。 %(relativeCreated)d:从Logger创建到输出日志时的毫秒数。 %(asctime)s:字符串形式的当前时间,默认格式为“2003-07-08 16:49:45,896”,逗号后为毫秒部分。 %(thread)d:线程ID,若不可用则缺失。 %(threadName)s:线程名,若不可用则缺失。 %(process)d:进程ID,若不可用则缺失。 %(message)s:用户输出的具体日志消息。
| 属性 | 格式 | 描述 |
|---|---|---|
| asctime | %(asctime)s | 日志产生的时间,默认格式为2003-07-08 16:49:45,896 |
| created | %(created)f | time.time()生成的日志创建时间戳 |
| filename | %(filename)s | 生成日志的程序名 |
| funcName | %(funcName)s | 调用日志的函数名 |
| levelname | %(levelname)s | 日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
| levelno | %(levelno)s | 日志级别对应的数值 |
| lineno | %(lineno)d | 日志所针对的代码行号(如果可用的话) |
| module | %(module)s | 生成日志的模块名 |
| msecs | %(msecs)d | 日志生成时间的毫秒部分 |
| message | %(message)s | 具体的日志信息 |
| name | %(name)s | 日志调用者 |
| pathname | %(pathname)s | 生成日志的文件的完整路径 |
| process | %(process)d | 生成日志的进程ID(如果可用) |
| processName | %(processName)s | 进程名(如果可用) |
| thread | %(thread)d | 生成日志的线程ID(如果可用) |
| threadName | %(threadName)s | 线程名(如果可用) |
Logger对象的高级配置与组件协作
除了基础配置,深入理解并配置Logger对象是实现复杂日志需求的关键。
针对不同数据流或模块,可以设置差异化的日志级别,以实现更精细的控制。
Logger与多Handler配置示例
import logging
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log',encoding='utf-8')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#logger对象可以添加多个fh和ch对象
logger.addHandler(fh)
logger.addHandler(ch)
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
logging库主要由四个组件构成:Logger、Handler、Filter和Formatter。Logger对象为应用程序提供直接使用的接口;Handler负责将日志发送到指定的目的地(如文件、控制台或网络);Filter提供过滤日志信息的机制;Formatter则指定日志的显示格式。此外,可以通过logger.setLevel(logging.DEBUG)统一设置Logger级别,或通过fh.setLevel(logging.DEBUG)单独为某个文件处理器设置特定级别,从而实现更灵活的日志控制。
以上内容涵盖了Python logging模块的核心使用技巧。如需了解更多关于Python logging模块的进阶资料,建议关注本站发布的其他相关文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













