一、介绍四大组件    

日志处理流程中,包含了 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("错误")

 

 

参考文档: