描述
环境: python3.x
源码: /Lib/logging/init.py
python提供了logging模块,用于记录程序运行过程中的一些关键信息,以便于对程序的运行状况进行跟踪。
logging模块简单易用且功能强大。该模块支持将日志信息保存在不同的地方,如:日志文件、Windows事件、邮件、http请求等。由于logging模块内容较多,无法详细记录,更多内容请查看官方文档
模块介绍
Logging.Logger
用于记录日志
logger类不直接实例化,但是需要通过函数logging.getLogger(name)
获取。相同的name将会返回相同Logger实例的引用。
name是一个点分字符串,如
foo
foo.bar
foo.bam
foo.bar.baz
...
foo.bar
foo.bam
foo.bar.baz
都是foo
后裔
同理foo.bar.baz
是foo.bar
的后裔
如果直接使用logging.debug()
等方法,则默认使用name为root的logger。
配置
Logger.propagate
指定了日志的传播性。当值为true
时,日志将会传播给祖先logger。当值为false
时,日志将不向上传播。
Logger.setLevel(lvl)
指定了日志的等级,等级值小于lvl
的日志将会被忽略。给handler设置日志等级也可以实现该效果。
等级 | 值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
Logger.getChild(suffix)
获取子日志实例,``logging.getLogger('abc').getChild('def.ghi')相同于
logging.getLogger('abc.def.ghi')`
Logger.addHandler(hdlr)
和 Logger.removeHandler(hdlr)
为logger增删Handler。
Logger.addFilter(filt)
和 Logger.removeFilter(filt)
为logger增删Filter。
日志方法
基本用法
Logger.debug(msg, *args, **kwargs)
Logger.info(msg, *args, **kwargs)
Logger.warning(msg, *args, **kwargs)
Logger.error(msg, *args, **kwargs)
Logger.critical(msg, *args, **kwargs)
Logger.log(lvl, msg, *args, **kwargs)
Logger.exception(msg, *args, **kwargs)
# example
logging.basicConfig(level=logging.DEBUG)
logging.debug('log debug')
logging.info('log info')
logging.warning('log warning')
logging.error('log error')
logging.critical('log critical')
logging.shutdown() # 应该在应用程序退出时调用
复杂用法
logging.basicConfig(format='[%(asctime)s] %(message)s, %(user)s => %(pwd)s', datefmt='%Y-%m-%d %H:%M:%S')
extra = {'user': 'admin', 'pwd': '123456'}
logging.warning('login failed: %s', 'wrong password', extra=extra)
# [2017-07-21 13:19:31] login failed: wrong password, admin => 123456
注:logging.basicConfig
方法需要在输出日志前调用,否则无法生效。
Logging.Handler
用于处理日志,将适当的日志保存到指定位置
配置
handler.setLevel()
方法与logger中一样,指定将发送到适当目标的最低严重性。为什么有两种setLevel()
方法?logger中设置的级别决定了将其传递给其handler的消息的严重程度。每个handler中设置的级别决定自身将发送哪些消息。
handler.setFormatter()
为handler设置Formatter。
handler.addFilter()
并handler.removeFilter()
为handler增删Filter。
使用方法
Logging.Handler
是一个基类,用于定义接口,因此不应该被实例化。需要建立子类并实现接口。
常见的子类:
子类 | 描述 |
---|---|
StreamHandler | 发送日志信息到stream |
FileHandler | 发送日志信息到文件 |
SMTPHandler | 发送日志信息到邮箱 |
HTTPHandler | 使用get或post发送日志信息到http服务器 |
Logging.Formatter
用于日志的格式化
使用方法
# 创建logger并设置日志级别
logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG)
# 创建handler并设置日志级别
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 创建formatter并添加至handler
formatter = logging.Formatter(fmt='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
# 将handler添加至logger
logger.addHandler(handler)
# 使用logger
logger.debug('log debug')
# [2017-07-22 09:10:07] log debug
模块级函数
logging.getLogger(name=None)
获取指定name
的logger实例,当name=None
时,返回name
为root的logger实例。
logging.getLoggerClass()
获取logger的类,一般用于子类的继承。
logging.basicConfig(**kwargs)
对日志系统进行基础的配置,该函数会根据args为root logger创建StreamHandler和默认的Formatter,以下为logging.basicConfig(**kwargs)
参数的描述:
参数 | 描述 |
---|---|
filename | 指定一个文件名来创建FileHandler,这将取代默认的StreamHandler |
filemode | 如果文件名已指定,改参数将指定文件打开方式,默认‘a’ |
format | 为handler指定字符串格式 |
datefmt | 指定时间/日期格式 |
style | 3.2版本加入,如果format已指定,改参数将修改格式串的风格,默认‘%’ |
level | 为root logger指定日志等级 |
stream | 指定流来初始化StreamHandler。改参数与filename参数无法兼容,否则将会报错ValueError |
handlers | 3.3版本加入,为root logger指定Handler,如果format没有指定将会使用默认formatter。改参数与filename、stream不兼容,否则将会报错ValueError |
线程安全
logging模块是线程安全的。它通过使用线程锁实现这一点;有一个锁来序列化访问模块的共享数据,每个处理程序也创建一个锁来序列化对其底层I / O的访问。
如果使用signal模块来实现异步信号处理程序,则在该程序中无法使用logging模块。
使用起来
总结
以上为自己在学习logging模块时的记录,如有错误请各位指正,谢谢。