整个模块可分为以下几个部分:
- Logger:是我们记录日志时创建的对象,可以调用Logger的方法传入日志模板和信息,来生成一条条日志记录,日志记录称为Log Record
- Log Record:指代生成的一条条日志记录
- Handler:用来处理日志记录,它可以将Log Record输出到我们指定的日志位置和存储形式,如我们可以指定将日志通过FTP协议记录到远程的服务器上
- Formatter:实际上生成的Log Record也是一个个对象,如果我们想要将它们保存成一条条我们想要的日志文本,就需要有一个格式化的过程,这个过程就有Formatter来完成,返回值就是日志字符串,然后传回给Handler来处理
- Filter:保存日志的时候我们可能不需要全部保存,只需要保存一部分我们需要的,所以保存日志前需要进行一步过滤,留下我们想要的日志,如只保存某个级别的日志,这个过程交给Filter完成
- Parent Handler:Handler之间可以存在分层关系,以使得不同的Handler之间共享相同功能的代码
logging.basicConfig:
参数:
- filename:即日志输出的文件名,指定了这个信息后,实际上会启用FileHandler,而不再是StreaHandler,这样日志文件便会输出到文件中了
- filemode:这个是指定日志文件的写入方式,有两种形式,一种是w,一种是a,分别代表清除后写入和追加写入
- 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:打印日志信息 - datefmt:指定时间的输出格式
- style:如果format参数指定了,这个参数就可以指定格式化时的占位符风格,如%、{、$ 等
- level:指定日志输出的类别,程序会输出大于等于此级别的信息
- stream:在没有指定filename的时候会默认使用StreamHandler,这时stream可以指定初始化的文件流
- handlers:可以指定日志处理时所使用的handlers,必须是可迭代的
日志等级(level):
logging模块中共提供了如下等级(每个等级都会对应一个数值):
- CRITICAL:50
- FATAL:50
- ERROR:40
- WARNING:30
- WARN:30
- INFO:20
- DEBUG:10
- NOTSET:0
我们设置了输出level后,系统便只会输出level数值大于或等于该level的日志结果
Handler:
logging模块提供的handler有:
- StreamHandler:日志输出到流,可以是sys.stderr, sys.stdout或者文件
- FileHandler:日志输出到文件
- BaseRotatingHandler:基本的日志回滚方式
- RotatingHandler:日志回滚方式,支持日志文件最大数量和日志文件回滚
- TimeRotatingHandler:日志回滚方式,在一定时间区域内回滚日志文件
- SocketHandler:远程输出日志到TCP/IP sockets
- DatagramHandler:远程输出日志到UDP sockets
- SMTPHandler:远程输出日志到邮件地址
- SysLogHandler:日志输出到syslog
- NTEventLogHandler:远程输出日志到Windows NT/2000/XP的事件日志
- MemoryHandler:日志输出到内存中的指定buffer
- HTTPHandler:通过“GET”或者“POST”远程输出到HTTP服务器
Formatter:
在进行日志格式化输出的时候,我们可以不借助于basicConfig来全局配置格式化输出内容,而是借助于Formatter来完成,Formatter是与Handler搭配使用的
root logger:
root logger是logger中最主要的部分,是无需配置可以直接使用的logger,有两种方式可以访问root logger
- logger.getLogger
- logging.root
Handler的主要作用是将LogRecord发送到指定位置,而在使用root logger时,默认是显示在终端中的,对root的handler进行测试:
import logging
print(logging.root.handlers)
输出:
[]
从上述测试中可以看出,Handler是存放在一个列表中,但是root logger的默认值没有任何handler,以下是查询文档结果:
The event is output using a ‘handler of last resort’, stored in logging.lastResort. This internal handler is not associated with any logger, and acts like a StreamHandler which writes the event description message to the current value of sys.stderr (therefore respecting any redirections which may be in effect). No formatting is done on the message - just the bare event description message is printed. The handler’s level is set to WARNING, so all events at this and greater severities will be output.
通过查询文档可知,默认的handler存放在logging.lastResort中,尝试访问这个模块:
import logging
print(logging.lastResort)
输出:
<_StderrHandler <stderr> (WARNING)>
可以得知在未配置root logger时,使用的Handler是StderrHandler,级别为warning,输入到stderr
参考:
https://cuiqingcai.com/6080.html
https://www.jianshu.com/p/cad8a77762b3