程序员社区

python logging模块

整个模块可分为以下几个部分:

  • 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

  1. logger.getLogger
  2. 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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » python logging模块

一个分享Java & Python知识的社区