目录
logging.basicConfig(**kwargs)函数参数
日志配置参数
日志等级
| 日志等级(level) | 描述 |
| DEBUG | 调试信息,通常在诊断问题的时候用 |
| INFO | 普通信息,确认程序按照预期运行 |
| WARNING | 警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,但程序还是继续运行 |
| ERROR | 错误信息,程序运行中出现了一些问题导致程序某些功能无法执行 |
| CRITICAL | 危险信息,一个严重的错误,导致程序无法继续运行 |
formatter格式化
| 格式 | 描述 |
| %(asctime)s | 日志事件发生的时间 |
| %(created)f | 日志事件发生的时间戳,调用time.time()函数返回的值 |
| %(relativeCreated)d | 日志事件发生的时间相对于logging模块加载时间的相对毫秒数 |
| %(msecs)d | 日志事件发生时间的毫秒部分 |
| %(levelname)s | 该日志记录的文字形式的级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
| %(levelno)s | 该日志记录的数字形式的级别(10, 20, 30, 40, 50) |
| %(name)s | 所使用的日志器名称,默认是'root'(默认使用的是root logger) |
| %(message)s | 日志记录的文本内容 |
| %(pathname)s | 调用日志记录函数的源码文件的全路径 |
| %(filename)s | pathname的文件名部分(含文件后缀) |
| %(module)s | filename的名称部分(不含后缀) |
| %(lineno)d | 调用日志记录函数的源代码所在的行号 |
| %(funcName)s | 调用日志记录函数的函数名 |
| %(process)d | 进程ID |
| %(processName)s | 进程名称 |
| %(thread)d | 线程ID |
| %(thread)s | 线程名称 |
级别常用函数
| 函数 | 说明 |
| logging.debug(msg, *args, **kwargs) | 创建一条级别为DEBUG的日志记录 |
| logging.info(msg, *args, **kwargs) | 创建一条级别为INFO的日志记录 |
| logging.warning(msg, *args, **kwargs) | 创建一条级别为WARNING的日志记录 |
| logging.error(msg, *args, **kwargs) | 创建一条级别为ERROR的日志记录 |
| logging.critical(msg, *args, **kwargs) | 创建一条级别为CRITICAL的日志记录 |
| logging.log(level, *args, **kwargs) | 创建一条级别为level的日志记录 |
**kwargs参数中的关键参数
| 参数名 | 用法说明 |
| stack_info | 值为布尔型,默认为False。值为True时,栈信息会被添加到日志中。 |
| extra | 值为dict型,可以用来自定义消息格式中所包含的格式字段,但其key值不能与logging模块定义的格式字段冲突。 |
| exc_info | 值为布尔型,值为True时,将异常信息添加到日志消息中,没有异常信息则添加None到日志中。 |
logging.basicConfig(**kwargs)函数参数
| 参数名称 | 描述 |
| filename | 指定日志输出目标文件的文件名,日志信息将写入到指定文件中,不会再控制台打印 |
| filemode | 指定日志文件的打开模式,默认为'a'。(该选项只在filename指定时有效) |
| format | 指定日志输出内容的格式 |
| datefmt | 指定日志输出的时间日期格式。(该选项只在format中设置了时间字段%(asctime)s时有效) |
| level | 指定日志器的日志级别,即指定最低级别的日志输出 |
| stream | 指定日志输出目标stream(stream和filename不能同时存在,否则出现ValueError异常) |
| style | 指定format格式字符串风格,取值为'%'、'{'、'$',默认为'%' |
| handlers | 该选项被指定时,它应该是一个创建了多个Handler的可迭代对象,这些handler会被添加到rootlogger。(filename、stream和handlers只能同时单独存在,否则出现ValueError异常) |
简单的日志代码
import logging
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.error('This is a debug log')
logging.warning('This is a warn log')
logging.critical('This is a critical log')
![]()
注:默认最低输出日志级别是WARNING
调整输出级别并指定格式输出
import logging
LOG_FORMAT = '时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t错误信息:%(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT) # 指定最低输出级别为DEBUG级别
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.error('This is a debug log')
logging.warning('This is a warn log')
logging.critical('This is a critical log')
指定日志信息输出到文件中
import logging
LOG_FORMAT = '时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t错误信息:%(message)s'
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT,filename='%s_log'%__name__)
logging.log(logging.DEBUG, "This is a debug log.") # 同logging.debug("This is a debug log.")
logging.log(logging.INFO, "This is a info log.") # 同上
logging.log(logging.WARNING, "This is a warning log.") # 同上
logging.log(logging.ERROR, "This is a error log.") # 同上
logging.log(logging.CRITICAL, "This is a critical log.") # 同上
四大日志组件
| 组件 | 描述说明 |
| Loggers(日志记录器) | 提供程序直接使用的接口 |
| Handlers(日志处理器) | 将记录的日志发送到指定的位置 |
| Filters(日志过滤器) | 用于过滤特定的日志记录 |
| Formatters(日志格式器) | 用于控制日志信息的输出格式 |
四大组件的方法
Logger常用的配置方法
| 方法 | 说明 |
| Logger.setLevel() | 设置日志器处理的日志消息的最低级别 |
| Logger.addHandler() | 为logger对象添加一个handler对象 |
| Logger.removeHandler() | 为logger对象移除一个handler对象 |
| Logger.addFilter() | 为logger对象添加一个filter过滤器对象 |
| Logger.removeFilter() | 为logger对象移除一个filter对象 |
对logger对象创建日志记录方法
| 方法 | 描述 |
| Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical() | 创建一个与其方法名对应等级的日志记录 |
| Logger.exception() | 通常只是在exception handler中调用此方法,用来创建一个类似于Logger.error()的日志消息,Logger.exception()会输出堆栈追踪信息。 |
| Logger.log() | 指定一个明确的日志等级(level)参数来创建一个日志记录 |
Handler组件配置方法
| 方法 | 描述 |
| Handler.setLevel() | 设置handler将处理的日志消息的最低严重级别 |
| Handler.setFormatter() | 为handler创建一个格式器对象 |
| Handler.addFilter() | 为handler添加一个过滤器对象 |
| Handler.removeFilter() | 为handler删除一个过滤器对象 |
Handler子类方法
| Handler子类方法 | 描述 |
| logging.StreamHandler() | 将日志信息保存或输出到Stream,输出到控制台 |
| logging.FileHandler() | 将日志信息保存到磁盘文件,默认情况下文件大小会无限增长,输出到文件 |
| logging.handlers.RotatingFileHandler() | 将日志信息保存到磁盘文件,并支持日志文件按大小切割 |
| logging.hanlders.TimedRotatingFileHandler() | 将日志信息保存到磁盘文件,并支持日志文件按时间切割 |
| logging.handlers.HTTPHandler() | 将日志信息以GET或POST的方式发送给HTTP服务器 |
| logging.handlers.SMTPHandler() | 将日志信息发送给指定的email地址 |
Formater组件
def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
实例化参数:
| 参数名 | 用法说明 |
| fmt | 指定消息格式化字符串,不指定时默认使用message的原始值 |
| datefmt | 指定日期格式字符串,不指定时默认使用"%Y-%m-%d %H:%M:%S"格式 |
| style | 格式化符号,取值有'%', '{'、'$',不指定时默认使用'%' |
Filter组件
class Filter(object):
"""
Filter instances are used to perform arbitrary filtering of LogRecords.
Loggers and Handlers can optionally use Filter instances to filter
records as desired. The base filter class only allows events which are
below a certain point in the logger hierarchy. For example, a filter
initialized with "A.B" will allow events logged by loggers "A.B",
"A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
initialized with the empty string, all events are passed.
一个filter实例化时传递的name参数值为'A.B',则该filter实例将只允许名称为如下规则的loggers产
生的日志记录通过过滤:'A.B','A.B,C','A.B.C.D','A.B.D',而名称为'A.BB', 'B.A.B'的
loggers产生的日志则会被过滤掉。如果name的值为空字符串,则允许所有的日志事件通过过滤。
"""
def __init__(self, name=''):
self.name = name
self.nlen = len(name)
def filter(self, record):
"""
Determine if the specified record is to be logged.
Is the specified record to be logged? Returns 0 for no, nonzero for
yes. If deemed appropriate, the record may be modified in-place.
filter方法用于具体控制传递的record记录是否能通过过滤,如果该方法返回值为0表示不能通
过过滤,返回值为非0表示可以通过过滤。
"""
if self.nlen == 0:
return True
elif self.name == record.name:
return True
elif record.name.find(self.name, 0, self.nlen) != 0:
return False
return (record.name[self.nlen] == ".")
简单的组件实现代码
import logging
# 创建日志处理器对象
logger = logging.getLogger('%s.log'%__name__)
logger.setLevel(level=logging.DEBUG) # 创建日志器输出的最低级别,决定控制台和文件日志输出最低级别
# 创建日志输出
fh_strea = logging.StreamHandler() # 控制台输出
fh = logging.FileHandler('test.log') # 写入到文件
fh.setLevel(level=logging.DEBUG) # 创建handler最低输出级别,决定文件日志输出最低级别
# 创建handler日志格式
LOG_FORMAT = logging.Formatter('时间:%(asctime)s\t级别:%(levelname)s\t行号:%(lineno)d\t日志信息:%(message)s')
fh.setFormatter(LOG_FORMAT)
fh_strea.setFormatter(LOG_FORMAT)
# 添加日志配置到创建的日志对象中
logger.addHandler(fh) # 添加文件输出
logger.addHandler(fh_strea) # 添加控制台输出
def sum():
try:
for i in range(5):
a = 12/(i-2)
logger.debug(a)
except Exception as e:
logger.error(e)
sum()
![]()

本文详细解读Python logging模块的日志等级、formatter配置、常用函数及基本配置方法。包括设置DEBUG、INFO、WARNING等不同级别日志,理解日志组件如Logger、Handler、Filter和Formatter的作用,以及如何灵活运用它们进行高效日志管理。
523

被折叠的 条评论
为什么被折叠?



