python利用logging记录日志

python利用logging记录日志

logging库采取了模块化的设计,提供了许多组件:记录器Logger,处理器Handler, 过滤器Filter和格式化器Formatter.

过滤器用于过滤记录器和处理器

  1. Logger暴露了应用程序代码能直接使用的接口

    1. Logger对象需要做三件事情,首先,它们向应用代码暴露了很多方法,这样应用就可以在运行时记录消息,其次,记录器对象通过严重程度(默认的过滤设施)或者过滤器对象来决定哪些日志消息需要记录下来.第三,记录器对象将相关的日志消息传递给所有感兴趣的日志处理器. 常用的记录器对象的方法分为两类:配置和发送消息

    2. Logger.setLevel()指定logger将会处理的最低的安全等级日志信息,debug是最低的内置安全等级,critical是最高的内建安全等级.例如,如果严重程度是INFO,记录器将只处理INFO, WARNING,ERROR和CRITICAL消息,DEBUG消息将会被忽略.

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

    4. Logger.addFilter()和Logger.removeFilter()从记录器对象添加和删除过滤器对象

  2. Handler将(记录器产生的)日志记录发送至合适的 目的地:可以是文件,标准输出,邮件,或者通过socket,http等协议发送到任何地方


    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKnmhaQl-1605176592465)(C:\Users\93623\AppData\Roaming\Typora\typora-user-images\image-20201105160053975.png)]

    1. 处理程序对象负责将适当的日志消息(基于日志消息的严重性)分派到处理程序的指定目标,Logger对象可以通过addHandler()方法增加零个或者多个handler对象.举个例子,一个应用可以将所有的日志消息发送至日志文件,所有的错误级别(error)及以上的日志消息发送至标准输出,所有的严重级别(critical)日志消息发送至某个电子邮箱,在这个例子中需要三个独立的处理器,每一个负责将特定级别的消息发送至特定的位置.
    2. 常见的有四种:
    3. logging.StreamHandler->控制台输出,构造函数:StreamHandler([strm]),strm参数是一个文件对象,默认是sys.stderr
    4. logging.FileHandler->文件输出, 构造函数:FileHandler(filename[,mode]),filename是文件名,必须指定一个文件名,mode是文件的打开方式,默认是’a’,即添加到文件末尾.
    5. logging.handlers.RotatingFileHandler->按照大小自动分割日志文件,一旦达到指定的大小重新生成文件, 构造函数:RotatingFileHandler(filename[,mode[,maxBytes,[backupCount]]]), maxBytes用于指定日志文件的最大文件大小,如果maxBytes为0,意味着日志文件可以无限大,这时重命名过程就不会发生.backupCount用于指定保留的备份文件的个数,比如,如果指定为2,当重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除.
    6. logging.handlers.TimedRotatingFileHandler->按照时间自动分割日志文件,间隔一定时间就自动创建新的日志文件.它的构造函数是:
      TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
      其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
      interval是时间间隔。
      when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
      S 秒
      M 分
      H 小时
      D 天
      W 每星期(interval==0时代表星期一)
      midnight 每天凌晨
  3. Filter提供了更好的粒度控制,它可以决定输出哪些日志记录

  4. Formatter指明了最终输出中日志记录的布局:日志信息的顺序,结构和内容

    ormat参数中可能用到的格式化信息:

    %(name)s Logger的名字
    %(levelno)s 数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s 调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程ID。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程ID。可能没有
    %(message)s 用户输出的消息
    1. Formatter对象设置日志信息最后的规则,结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S

    2. 构造方法:ft = logging.Formatter.__init_(fmt=None,datefmt=None,style='%')

warning debug 就会选warning

import logging

# 记录器
logger = logging.getLogger()
print(logger)
print(type(logger))
# # <RootLogger root (WARNING)>
# # <class 'logging.RootLogger'>
import logging
# 记录器
logger = logging.getLogger('applog')
print(logger)
print(type(logger))
# # <Logger applog (WARNING)>
# # <class 'logging.Logger'>
import logging
logger = logging.getLogger("applog")
logger.setLevel(logging.INFO)

consolehandler = logging.StreamHandler()
consolehandler.setLevel(logging.DEBUG)

filehandler = logging.FileHandler(filename="addlog.log")
filehandler.setLevel(logging.CRITICAL)

formatter = logging.Formatter("%(asctime)8s|%(levelname)8s|%(filename)s:%(lineno)s|%(message)s")
consolehandler.setFormatter(formatter)
filehandler.setFormatter(formatter)

logger.addHandler(consolehandler)
logger.addHandler(filehandler)

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

猜你喜欢

转载自blog.csdn.net/weixin_46129834/article/details/109650521