logging模块(三)—— logging日志框架

(一)logging日志框架组成部分

  • Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 Log Record。
  • Handler:即用来处理日志记录的类,它可以将 Log Record 输出到我们指定的日志位置和存储形式等,如我们可以指定将日志通过 FTP 协议记录到远程的服务器上,Handler 就会帮我们完成这些事情。
  • Formatter:实际上生成的 Log Record 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,那么这个过程就由 Formatter 来完成,返回的就是日志字符串,然后传回给 Handler 来处理。
  • Filter:另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过滤过程就交给 Filter 来完成。

(二)写入日志文件主要流程:

  1. 创建一个logger对象
  2. 设置日志级别level
  3. 创建一个handler,用于写入日志文件
  4. 设置handler输出格式formatter
  5. 将filter过滤后的logger发给handler

(三)实例:

使用logging日志模块记录日志文件

'''
logging日志框架-logger,formatter,filter,handler
'''

import logging

#创建一个logger对象
logger = logging.getLogger()

#设置logger日志级别
logger.setLevel(logging.NOTSET)

#设置日志去向
handler=logging.FileHandler(filename='study02.log', encoding='utf-8',)

#设置实际输入到日志文件的日志级别
handler.setLevel(logging.ERROR)

#设置日志格式
formatter=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

#给logger对象添加日志去向
logger.addHandler(handler)

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')
logger.error('this is error message')
logger.critical('this is cirtical message')




(四)扩展

Loggers:

Logger 对象要做三件事情。

首先,它们向应用代码暴露了许多方法,这样应用可以在运行时记录消息。

其次,记录器对象通过严重程度(默认的过滤设施)或者过滤器对象来决定哪些日志消息需要记录下来。

第三,记录器对象将相关的日志消息传递给所有感兴趣的日志处理器。

常用的记录器对象的方法分为两类:配置和发送消息。

这些是最常用的配置方法:

Logger.setLevel()指定logger将会处理的最低的安全等级日志信息。

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

Logger.addFilter()从记录器对象添加过滤器对象。

Handlers

处理程序对象负责将适当的日志消息(基于日志消息的严重性)分派到处理程序的指定目标。

Logger 对象可以通过addHandler()方法增加零个或多个handler对象。举个例子,一个应用可以将所有的日志消息发送至日志文件,所有的错误级别(error)及以上的日志消息发送至标准输出,所有的严重级别(critical)日志消息发送至某个电子邮箱。在这个例子中需要三个独立的处理器,每一个负责将特定级别的消息发送至特定的位置。

常用的有4种: 

1)    logging.StreamHandler -> 控制台输出 


使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。

它的构造函数是:StreamHandler([strm])

  • 其中strm参数是一个文件对象。默认是sys.stderr


2)   logging.FileHandler  -> 文件输出


和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。

它的构造函数是:FileHandler(filename[,mode])

  • filename是文件名,必须指定一个文件名。
  • mode是文件的打开方式。默认是’a',即添加到文件末尾。


3)   logging.handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件 


这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。

它的构造函数是:RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

  • 其中filename和mode两个参数和FileHandler一样。
  • maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
  • backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。


4)   logging.handlers.TimedRotatingFileHandler  -> 按照时间自动分割日志文件 


这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。

它的构造函数是:TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

  • 其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
  • interval是时间间隔。
  • when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
  • S 秒
  • M 分
  • H 小时
  • D 天
  • W 每星期(interval==0时代表星期一)
  • midnight 每天凌晨

参考地址:https://www.cnblogs.com/nancyzhu/p/8551506.html

gitbuh地址: https://github.com/panc-test/python-study.git

发布了46 篇原创文章 · 获赞 39 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/panc_guizaijianchi/article/details/104339874