使用介绍

logging日志模块四大组件

组件名称 对应类名 功能描述
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了日志过滤
格式器 Formatter 决定日志记录的最终输出格式

组件之间的关系

  1. 日志器需要通过处理器将日志信息输出到目标位置;
  2. 不同的处理器可以将日志输出到不同的位置;
  3. 日志器可设置多个处理器将同一个日志记录输出到不同的位置;
  4. 每个处理器可设置自己的过滤器实现日志过滤,只保留感兴趣的日志;
  5. 每个处理器都可设置自己的格式器,实现同一条日志以不同的格式输出到不同的地方;

Logger常用方法:

方法 描述
Logger.setlevel() 设置日志器将会处理的最低级别日志
Logger.addHandler()和Logger.removeHandler() 为该logger对象添加 和 移除一个handler对象
Logger.addFilter()和Logger.removeFilter() 为logger对象添加和移除一个filter对象
Logger.debug()、Logger.info()、Logger.warnings()、Logger.error()、Logger.critical() 日志等级

常用的Handler:

Handler 描述
logging.StreamHandler 将日志消息发送到输到stream
logging.FileHandler 将日志消息发送到磁盘文件
logging.Handlers.SMTPHandler 将日志消息发送给指定的email地址

logging常用函数

  1. logging.debug(msg, *args, **kwargs):创建一条级别为DEBUG的日志记录
  2. logging.info(msg, *args, **kwargs):创建一条级别为INFO的日志记录
  3. logging.warning(msg, *args, **kwargs):创建一条级别为warning的日志记录
  4. logging.error(msg, *args, **kwargs):创建一条级别为error的日志记录
  5. logging.critical(msg, *args, **kwargs):创建一条级别为critical的日志记录
  6. logging.log(level, *args, **kwargs):创建一条级别为level的日志记录
  7. logging.basicConfig(**kwargs): root logger进行一次性配置

logging.basicConfig()函数包含参数说明

参数名称 描述
filename 指定日志输出目标文件的文件名
filemode 指定日志文件的打开模式,默认为’a’
format 指定日志格式字符串
datefmt 指定日期/时间格式,需要再format中设置%(asctime)s才生效
level 指定日志器的日志级别
stream 指定日志输出目标stream,如sys.stdout
style 指定format格式字符串的风格,”%” 、”{“、”$”

logging中定义好用于format格式字符串说明:

参数说明 使用格式 描述
asctime %(asctime)s 将日志时间可读式输出,默认精确到毫秒
name %(name)s 所使用的日志器名称
filename %(filename)s 调用日志输出函数的模块的文件名
funcName %(funcName)s 由哪个function发出的log,调用日志输出函数的函数名
levelname %(levelname)s 日志的最终等级
message %(message)s 日志信息
lineno %(lineno)d 当前日志的行号
levelno %(levelno)s 该日志记录的数字形式的日志级别(10、20、30、40、50)
pathname %(pathname)s 完整路径,调用日志输出函数的模块的完成

简单模式

  1. import logging
  2. # 配置日志输出级别、格式
  3. logging.basicConfig(
  4. level=logging.DEBUG,
  5. format="%(asctime)s %(name)s %(levelname)s %(message)s",
  6. datefmt='%Y-%m-%d %H:%M:%S'
  7. )
  8. logging.debug("debug log")
  9. logging.info("info log")
  10. logging.warning("warning log")
  11. logging.error("error log")
  12. logging.critical("critical log")

日志流

日志流处理流程:

  1. 创建一个logger;
  2. 设置下logger的日志的等级;
  3. 创建合适的Handler;
  4. 设置每个Handler的日志等级;
  5. 创建下日志的格式
  6. 向Handler添加已创建的格式
  7. 将Handler添加到logger中 ```python

    解决重复日志问题,判断是否已有handler

    def log(msg):

    创建logger

    _logger = logging.getLogger(“zaygee”) _logger.setLevel(logging.DEBUG)

    如果没有handlers,则创建,有则直接写日志

    if not _logger.handlers:

    1. # 创建handler
    2. fh = logging.FileHandler("test.log", encoding="utf-8")
    3. ch = logging.StreamHandler()
    4. # 设置日志输出格式
    5. formatter = logging.Formatter(
    6. fmt="%(asctime)s %(name)s %(filename)s %(message)s",
    7. datefmt="%Y-%m-%d"
    8. )
    9. # 为handler指定输出格式
    10. fh.setFormatter(formatter)
    11. ch.setFormatter(formatter)
    12. # 为logger添加日志处理器
    13. _logger.addHandler(fh)
    14. _logger.addHandler(ch)

    输出日志

    _logger.info(msg)

log(“测试一下”) log(“测试二下”)

2020-11-08 zaygee logging_test.py 测试一下

2020-11-08 zaygee logging_test.py 测试二下

```

参考原文:https://www.cnblogs.com/Nicholas0707/p/9021672.html#_label1_5