一、介绍四大组件
日志处理流程中,包含了 logging 模块的四大组件,分别是:
组件名称 | 对应类名 | 功能描述 |
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
logging模块就是通过这些组件来完成日志处理的。
四大组件相关的类对象介绍:
1. Logger 类:
最常用的配置方法如下:
方法 | 描述 |
Logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别 |
Logger.addHandler() 和 Logger.removeHandler() | 为该logger对象添加 和 移除一个handler对象 |
Logger.addFilter() 和 Logger.removeFilter() | 为该logger对象添加 和 移除一个filter对象 |
logger 对象配置完成后,可以使用下面的方法来创建日志记录:
如何获得一个 Logger 对象呢?
一种方式是通过 Logger 类的实例化方法创建一个 Logger 类的实例,但是我们通常都是用第二种方式—— logging.getLogger() 方法。
logging.getLogger() 方法有一个可选参数 name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为 'root'。若以相同的 name 参数值多次调用 getLogger() 方法,将会返回指向同一个 logger 对象的引用。
2. Handler 类
Handler 对象的作用是(基于日志消息的 level )将消息分发到 handler 指定的位置(文件、网络、邮件等)。Logger 对象可以通过 addHandler() 方法为自己添加0个或者更多个 handler 对象。比如,一个应用程序可能想要实现以下几个日志需求:
(1) 把所有日志都发送到一个日志文件中
(2) 把所有严重级别大于等于 error 的日志发送到 stdout(标准输出)
(3) 把所有严重级别为 critical 的日志发送到一个 email 邮件地址。
这种场景就需要3个不同的 handlers,每个 handler 负责发送一个特定严重级别的日志到一个特定的位置。
Handler 类常用API:
API | 作用 |
Handler.setLevel(lel) | 指定被处理的信息级别,低于 lel 级别的信息将被忽略 |
Handler.setFormatter() | 给这个handler选择一个格式 |
Handler.addFilter(filt)和 Handler.removeFilter(filt) | 新增和删除一个 filter 对象 |
因为 Handler类是一个基类,同时提供一些子类可以直接使用或覆盖的默认行为。下面一些常用的 Handler:
Handler | 描述 |
logging.StreamHandler | 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。 |
logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 |
logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 |
logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割 |
logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 |
logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址 |
logging.NullHandler | 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。 |
3. Formater 类
Formater 对象用于配置日志信息的最终顺序,结构和内容。与 loggging.Handler 基类不同的是,应用代码可以直接实例化 Formatter 类。logging.Formatter(fmt, datefmt)。
4. Filter 类
Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。
二、日志流处理简要流程
1、创建一个logger
2、设置下logger的日志的等级
3、创建合适的Handler(FileHandler要有路径)
4、设置下每个Handler的日志等级
5、创建下日志的格式
6、向Handler中添加上面创建的格式
7、将上面创建的Handler添加到logger中
8、打印输出logger.debug\logger.info\logger.warning\logger.error\logger.critical
示例代码 :
import logging
#创建logger,如果参数为空则返回root logger
logger = logging.getLogger("nick")
logger.setLevel(logging.DEBUG) #设置logger日志等级
#创建handler
fh = logging.FileHandler("test.log",encoding="utf-8")
ch = logging.StreamHandler()
#设置输出日志格式
formatter = logging.Formatter(
fmt="%(asctime)s %(name)s %(filename)s %(message)s",
datefmt="%Y/%m/%d %X"
)
#注意 logging.Formatter的大小写
#为handler指定输出格式,注意大小写
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
#输出不同级别的log
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
参考文档: