优雅地记录Python程序日志2:模块组件化日志记录器(转载)
本篇将会涉及:
- logging的各个模块化组件
- 构建一个组件化的日志器
文章目录 [隐藏]
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')
我们在此创建了一个FileHandler处理器,并指定日志的文件名为log.log。
在创建日志处理器之后,可以通过日志记录器的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')
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("这是一个危险信息")
运行程序的结果如下:
![](http://upload-images.jianshu.io/upload_images/38544-eef772d4a65925db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
文章版权所有:州的先生博客,转载必须保留出处及原文链接
原文地址:https://zmister.com/archives/217.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# coding:utf-8 import logging def mylog(): # 创建一个日志记录器 log = logging.getLogger("test_logger") log.setLevel(logging.DEBUG) # 创建一个日志处理器 logHandler = logging.FileHandler(filename='log.log') 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 if __name__ == '__main__': # 输出日志 log = mylog() log.info("这是一个普通信息") log.debug("这是一个调试信息") log.warning("这是一个警告信息") log.error("这是一个错误信息") log.critical("这是一个危险信息")