内容来自官方文档,版本python3.x。
介绍
这是一个为应用和库提供事件日志的模块,所有python模块都可以使用这个标准库作为日志API。
logging模块包含4个基础类(对象):
- Logger类,暴露可以给应用直接使用的接口。
- Handler类,发送日志纪录(创建自Loggers对象)到目标。
- Filter类,决定日志纪录输出的更细颗粒度的处理器。
- Formatter类,指定日志纪录最终输出的格式。
Logger对象
不要直接实例化Logger,而是通过模块级函数logging.getLogger(name)返回
Logger对象。
部分属性和方法
setLevel
(level)
设置日志等级,日志严重程度低于这个等级的不会被记录。
debug
(msg, *args, **kwargs)
输出一条DEBUG等级的日志纪录。
info
(msg, *args, **kwargs)
输出一条INFO等级的日志纪录。
warning
(msg, *args, **kwargs)
输出一条WARNING等级的日志纪录。
error
(msg, *args, **kwargs)
输出一条ERROR等级的日志纪录。
Logging Levels
Level | Numeric value |
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
Handler对象
不要直接实例化Handler,这个对象是很多有用的子类的基础。
部分属性和方法
__init__
(level=NOTSET)
Formatter对象
Formatter对象的属性和方法负责把LogRecord
转换成string,可以格式化日志输出,通常在Formatter初始化的时候会指定格式。
实例化:logging.
Formatter
(fmt=None, datefmt=None, style='%')
部分属性和方法
format
(record)
formatTime
(record, datefmt=None)
Filter对象
Filter对象可以被Handlers
和 Loggers使用,用于比日志等级更复杂的过滤。
实例化: logging.
Filter
(name='')
LogRecord对象
当Logger
产生日志事件的时候,LogRecord对象会被自动创建;也可以手动通过makeLogRecord()
创建。
从3.2版本开始,创建LogRecord可以通过工厂方法getLogRecordFactory()
和 setLogRecordFactory()
,工厂方法可以提供更多的配置。
# 在LogRecord被创建的时候注入一个自定义的值
old_factory = logging.getLogRecordFactory()
def record_factory(*args, **kwargs):
record = old_factory(*args, **kwargs)
record.custom_attribute = 0xdecafbad
return record
logging.setLogRecordFactory(record_factory)
下面显示一个例子,来自cookbook:
import logging
# 模拟一些东西,用于演示logging的作用
action = ''
def do_something(a):
action = a
# 创建一个logger对象
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# 创建一个文件处理器来记录日志
fh = logging.FileHandler(r'C:\Users\lipei\Desktop\spam.log')
fh.setLevel(logging.DEBUG)
# 创建一个控制台处理器来显示比DEBUG更高级的ERROR的日志
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 创建formatter,并把formatter加入处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 把处理器加入logger对象
logger.addHandler(fh)
logger.addHandler(ch)
# 产生INFO等级的日志消息
# INFO等级的日志消息的日志消息会被记录到spam.log中,因为INFO比DEBUG高级
logger.info('做一些事情之前')
do_something('say')
logger.info('说了一些话')
do_something('running')
logger.info('跑步中')
do_something('working')
logger.info('在工作')
do_something('sleep')
logger.info('结束一天')
# 产生ERROR等级的日志消息
# ERROR比DEBUG、INFO都高级,所以会记录到spam.log和输出到控制台
logger.error('我就是想显示一条错误日志消息')
运行这个程序,看控制台的输出:
C:\Users\lipei\Desktop>python test.py
2020-04-26 10:51:53,280 - spam_application - ERROR - 我就是想显示一条错误日志消息
再看日志文件的输出: