关于logging
利用logging,我们在代码里面输出日志信息,这些日志信息可以包括代码中的数据、日志所在模块/文件/行、记录时间、日志级别等等,这些信息可以判断代码运行状态、查看具体代码信息以帮助我们定位问题。
在代码量大、模块多时,建议用logging来替代print,输出信息更加方便阅读和检索
下面是一个简单的例子
执行后 输入0
执行后 输入4
logging的简单使用
日志的级别
日志数据有不同的level or severity(级别或严重性),如下官方图介绍,级别从上到下依次递增
日志的默认级别被设定为WARNING,logging会按照设定的级别记录该级别或者之上级别的日志信息。默认级别是可以修改的
在之前的例子中看到,logging.info()中的数据就没有被记录,info(xx)表明该条日志数据是INFO级别。这里要注意下大小写,不要搞错了
修改日志级别
如上,在basicConfig()方法中设定级别
修改日志的显示格式
前面如 INFO:root:this is info ms,这条数据中包含了日志级别、记录器名称、具体数据三个元素,其实我们同样可以在basicConfig()方法中的format配置要显示哪些数据
如上,format中用%(xxx)s的形式来配置要显示的元素,元素间的如何连接可自定义,可用的xxx如下面官网介绍图
其中asctime字段显示的的日期和时间格式也可以通过datefmt字段自定义如
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
输出内容如下
12/12/2010 11:46:36 AM is when this event was logged
输出日志到文件
如上,同样是在basicConfig()配置,还可以配置encoding和处理错误编码的errors参数。
执行后,在执行目录下面会生成对应的log文件
logging模块的进一步介绍
总的来说,logging提供以下类供我们使用
Logger, Handler, Filter, and Formatter
Logger:生成记录器logger的类
Handler: 生成处理器handler的类
Filter:生成过滤器filter的类
Formatter: 生成格式奇formatter的类
记录器
logger = logging.getLogger(__name__)
如上,获得了一个记录器logger,名称可以自己随便取,不过官方推荐是像上面样使用模块名。
我们要输出日志,首先都必须要创建一个记录器,前面我们没有创建,直接使用logging.xx()来输出日志,系统就会帮我们创建一个叫root的记录器
根记录器root有以下函数来输出日志消息
debug() 、 info() 、 warning() 、 error() 和 critical()
记录器logger有以下作用
logger.setLevel():设定该记录器输出日志的最低级别
logger.addHandler() 和 Logger.removeHandler():该记录器添加或者删除处理器对象handler
logger.addFilter() 和 Logger.removeFilter(): 该记录器添加或者删除处理器对象filter
执行根记录器下的函数来输出日志消息如 logger.debug() logger.info()等
处理器handler
一个记录器logger可以有多不不同的handler,handler负责将日志消息数据输出到不同的地方,常见的用于生成处理器handler的类有
StreamHandler 将消息数据发送到标准输出流、错误流(如输出到命令行控制台)
FileHandler 将消息数据发送到文件(如写入到文件)
logging.FileHandler('filename.txt',encoding='utf-8')
如上,生成一个输出到文件的处理器handler
handler有以下面列出的函数
setLevel():设置该handler能处理的日志数据的最低级别,注意记录器logger也有方法setLevel() 记录器logger设置的级别确定将传递哪些级别的数据给handler。每个hanlder中设置的级别的确定该handler将输出哪些级别的消息
setFormatter() 设置该hanlder输出日志数据的格式
addFilter() 和 removeFilter() 分别在处理器上配置和取消配置过滤器对象
格式器formatter
格式器所谓的格式就是前面babasicConfig()方法中的format字段的内容,格式器要添加到处理器handler中来作用于handler的
执行后控制台输出
执行下生成指定的日志文件,文件内容
在配置文件中配置日志相关信息
myLogging.cnf
配置文件
[loggers]
keys=root,logging_b
[handlers]
keys=consoleHandler,textHandler
[formatters]
keys=consoleFormatter,textFormatter
[logger_root]
level=INFO
handlers=consoleHandler
[logger_logging_b]
level=INFO
handlers=consoleHandler,textHandler
qualname=logging_b
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=WARNING
formatter=consoleFormatter
args=(sys.stdout,)
[handler_textHandler]
class=FileHandler
level=CRITICAL
formatter=textFormatter
args=('myLog.txt',)
kwargs={'encoding': 'utf-8'}
[formatter_consoleFormatter]
format=>>>%(filename)s>>>%(levelname)s>>>%(message)s
[formatter_textFormatter]
format=>>>%(lineno)s>>>%(levelname)s>>>%(message)s
py文件 logging_b.py
在控制台和日志文件中的输出和前面不用配置文件时一样的
配置文件必须包含 [loggers], [handlers] 和 [formatters] 等部分
如果在[loggers]中有像xxxa这样的值,比如上面的logging_b,那么必须配置一个[logger_xxxa],并在下面配置该logger对应的的level handler等数据
对于[handlers] 和 [formatters]可同理类推
参照之前的不用配置文件的写法,配置文件的意思其实很好懂,对于qualname=logging_b,在上面没啥实际用处,可忽略
关于配置文件和logging更具体的信息,请参照官网
本篇代码执行环境为window 10, python3.10