logging包学习总结

1,632 阅读4分钟
"""
1、日志级别
Python 标准库 logging 用作记录日志,默认分为六种日志级别(括号为级别对应的数值),
NOTSET(0)、DEBUG(10)、INFO(20)、WARNING(30)、ERROR(40)、CRITICAL(50)。
我们自定义日志级别时注意不要和默认的日志级别数值相同,logging 执行时输出大于等于设置的日志级别的日志信息,
如设置日志级别是 INFO,则 INFO、WARNING、ERROR、CRITICAL 级别的日志都会输出。
"""

"""
2、logging流程
可以分为这几个部分:Logger、LogRecord、Filter、Handler、Formatter。

Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 Log Record。

Log Record:日志记录器。就代指生成的一条条日志记录。将日志传到相应的处理器处理

Handler:处理器。即用来处理日志记录的类,它可以将 Log Record 输出到我们指定的日志位置和存储形式等,
            如我们可以指定将日志通过 FTP 协议记录到远程的服务器上,Handler 就会帮我们完成这些事情。

Formatter:格式化器。实际上生成的 Log Record 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,
            那么这个过程就由 Formatter 来完成,返回的就是日志字符串,然后传回给 Handler 来处理。

Filter:过滤器。另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,
        如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过滤过程就交给 Filter 来完成。
        
Parent Handler:Handler 之间可以存在分层关系,以使得不同 Handler 之间共享相同功能的代码。

"""

"""
3、日志输出格式
WARRING   :     ROOT     :   warn message
日志级别    logger示例名称    日志消息内容

"""

"""
4、基本使用
logging 使用非常简单,使用 basicConfig() 方法就能满足基本的使用需要,如果方法没有传入参数,会根据默认的配置创建Logger 对象,
默认的日志级别被设置为 WARNING,默认的日志输出格式如上图,该函数可选的参数如下表所示。

filename    日志输出到文件的文件名
filemode    文件模式,w[+]、a[+]。清除后写入,追加写入
format      日志输出的格式
datefat     日志附带日期时间的格式  '%m/%d/%Y %I:%M:%S %p'
style       格式占位符,默认为 "%" 和 “{}”
level       设置日志输出级别
stream      定义输出流,用来初始化 StreamHandler 对象,不能 filename 参数一起使用,否则会ValueError 异常
handles     定义处理器,用来创建 Handler 对象,不能和 filename 、stream 参数一起使用,否则也会抛出 ValueError 异常

format指定日志信息输出格式参数如下:
%(levelno)s:打印日志级别的数值。
%(levelname)s:打印日志级别的名称。
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]。
%(filename)s:打印当前执行程序名。
%(funcName)s:打印日志的当前函数。
%(lineno)d:打印日志的当前行号。
%(asctime)s:打印日志的时间。
%(thread)d:打印线程ID。
%(threadName)s:打印线程名称。
%(process)d:打印进程ID。
%(processName)s:打印线程名称。
%(module)s:打印模块名称。
%(message)s:打印日志信息。
"""

"""
5、发生异常
但是当发生异常时,直接使用无参数的 debug()、info()、warning()、error()、critical() 方法并不能记录异常信息,
需要设置 exc_info 参数为 True 才可以,或者使用 exception() 方法,还可以使用 log() 方法,但还要设置日志级别和 exc_info 参数。

try:
    c = a / b
except Exception as e:
    # 下面三种方式三选一,推荐使用第一种
    logging.exception("Exception occurred")
    logging.error("Exception occurred", exc_info=True)
    logging.log(level=logging.DEBUG, msg="Exception occurred", exc_info=True)
"""

"""
6、自定义Logger
一个系统只有一个Logger对象,并且该对象不能被直接实例化,使用单例模式:获取Logger对象方法getLogger
这里的单例模式并不是说只有一个 Logger 对象,而是指整个系统只有一个根 Logger 对象,Logger 对象在执行 info()、error() 等方法时
实际上调用都是根 Logger 对象对应的 info()、error() 等方法。

我们可以创造多个 Logger 对象,但是真正输出日志的是根 Logger 对象
logger = logging.getLogger(__name__)

Logger 对象可以设置多个 Handler 对象和 Filter 对象,Handler 对象又可以设置 Formatter 对象。

常用配置方法:
Logger.setLevel() 指定记录器将处理的最低严重性日志消息,其中 debug 是最低内置严重性级别, critical 是最高内置严重性级别。 
例如,如果严重性级别为 INFO ,则记录器将仅处理 INFO 、 WARNING 、 ERROR 和 CRITICAL 消息,并将忽略 DEBUG 消息。

Logger.addHandler() 和 Logger.removeHandler() 从记录器对象中添加和删除处理程序对象。

Logger.addFilter() 和 Logger.removeFilter() 可以添加或移除记录器对象中的过滤器。
"""