转载自 州的先生博客 :https://zmister.com/archives/217.html
logging的模块组件化
在上一篇文章【优雅地记录Python程序日志:logging模块简介】中,我们介绍了 Python 的内置模块 logging 的使用,通过短短的几行代码我们就实现了一个日志记录器。
import logging
logging.basicConfig(level=logging.INFO,filename='test.log',format="%(levelname)s:%(asctime)s:%(message)s")
logging.error("出现了错误")
logging.info("打印信息")
logging.warning("警告信息")
在上面的例子中我们直接使用了 logging 模块提供的简单日志记录器。除此之外,logging 模块还提供了模块化的方法,通过日志记录器、日志处理器、过滤器和格式处理器等组件来灵活的配置日志器:
- 日志记录器 Loggers 提供程序调用日志记录的接口;
- 日志处理器 Handlers 用于将日志记录器创建的日志记录发送到相应的目标上;
- 过滤器 Filters 提供了对日志记录进行更详细的输出;
- 格式器 Formatters 用于指定输出的日志记录的最终格式;
在前面的例子中我们知道,一条日志记录是通过调用一个日志记录器( Logger 类的实例)的方法来执行的。每一个日志记录器都有一个 name 来标识这个日志记录器,比如上一篇文章中我们创建的日志记录起的 name 就是默认的 root。
日志记录器
通过 logging 的 getLogger() 方法,我们可以创建一个日志记录器,并指定其名称:
log = logging.getLogger("test_logger")
这样我们就实例化了一个名为 test_logger 的日志记录器。这个日志记录器除了包含一些基本的功能,比如调用各级别的日志方法外,还能够添加日志处理器、过滤器等。
日志处理器
日志处理器 Handlers 负责将相应的日志记录消息分发到指定的目标上。在 logging 模块中,有很多种日志处理器用于不同的用途,下面介绍几个常用的:
- StreamHandler:用于将日志消息发送到控制台;
- FileHandler:用于将日志消息写入文件中;
- SMTPHandler:用于将日志消息发送到指定的电子邮箱;
- HTTPHandler:使用GET或POST方法将日志消息发送给某个HTTP服务器;
其中我们最常使用的,还是 FileHandler 处理器,将日志消息写入文件中。
使用 logging.FileHandler() 可以创建一个 FileHandler 处理器处理器:
logHandler = logging.FileHandler(filename='log.log', encoding='utf-8')
我们在此创建了一个 FileHandler 处理器,并指定日志的文件名为 log.log,编码为 utf-8。
在创建日志处理器之后,可以通过日志记录器的 addHandler() 方法,将处理器添加到记录器中。
log.addHandler(logHandler)
日志格式器
在上一篇文章中,我们通过 logging.basicConfig() 的 format 参数来指定输出日志消息的格式。而在模块组件化中,我们使用 logging.Formatter() 方法来创建一个日志格式器。
formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
datefmt='%Y/%m/%d %I:%M:%S %p')
在创建之后,可以通过日志处理器的 setFormatter() 方法,将日志格式器添加到日志处理器中:
logHandler.setFormatter(formats)
这样,我们就基本组装好了一个模块化的日志器。接着就能够在程序中调用日志记录器的方法来记录日志:
import logging
def mylog():
print(inspect.stack()[0])
# 创建一个日志记录器
log = logging.getLogger("test_logger")
log.setLevel(logging.DEBUG)
# 创建一个日志处理器
logHandler = logging.FileHandler(filename='log.log', encoding='utf-8')
logHandler.setLevel(logging.DEBUG)
# 创建一个日志格式器
formats = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s',
datefmt='%Y/%m/%d %I:%M:%S %p')
# 将日志格式器添加到日志处理器中
logHandler.setFormatter(formats)
# 将日志处理器添加到日志记录器中
log.addHandler(logHandler)
return log
# 输出日志
log = mylog()
log.info("这是一个普通信息")
log.debug("这是一个调试信息")
log.warning("这是一个警告信息")
log.error("这是一个错误信息")
log.critical("这是一个危险信息")
运行程序的结果如下: