• 『无为则无心』Python日志 — 65、日志模块logging的使用


    1、logger类用法

    logger类:logger用于提供日志接口,常用于配置和发送日志消息。

    我们一般使用logging.getLogger(name)方法来获得一个logger对象。

    其中,可选参数name指定日志器名称,默认为“root”。

    常用方法包括:

    • logger.setLevel():设置日志器处理日志信息的最低级别。
    • logger.addHandler():为该logger对象添加一个handler对象。
    • logger.removeHandler():为该logger对象添加移除一个handler对象。
    • logger.addFilter():为该logger对象添加一个filter对象。
    • logger.removeFilter():为该logger对象移除一个filter对象。
    • 创建一个对应等级的日志记录:
      logger.debug()
      logger.info()
      logger.warning()
      logger.error()
      logger.critical()
    • logger.log():获取一个日志level参数,来创建一个日志记录。

    示例:

    python
    """
    logging模块是Python的内置模块,不需要安装。
    """
    # 导入logging模块
    import logging
    
    # 创建一个日志器,就是一个logger对象
    logger = logging.getLogger('logger')
    
    # 输出日志信息
    logger.debug('输出debug级别的日志')
    logger.info('输出info级别的日志')
    logger.warning('输出warning级别的日志')
    logger.error('输出error级别的日志')
    logger.critical('输出critical级别的日志')
    
    """
    # 右键执行代码
    # 结果如下:
    输出warning级别的日志
    输出error级别的日志
    输出critical级别的日志
    """

    总结:

    默认情况下Python的logging模块将日志打印到了标准输出中(控制台),且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING。

    2、handler类用法

    handler类:handler对象用于将指定的日志信息发送到指定的位置。

    一个logger对象可以添加多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。

    也就是说通过handler我们可以将日志同时输出到多个位置。

    常用的方法包括:

    • handler.setLevel():设置handler处理的日志信息最低级别。
    • handler.setFormatter():为handler设置一个格式器对象。
    • handler.addFilter():为handler添加一个过滤器对象。
    • handler.removeFilter():为handler删除一个过滤器对象。
    • logging.StreamHandler():将日志信息发送到Stream
    • logging.FileHandler():将日志消息发送到磁盘文件。

    示例:把上面的示例,实现DEBUG级别日志的输出。

    python
    """
    logging模块是Python的内置模块,不需要安装。
    """
    # 导入logging模块
    import logging
    
    # 创建一个日志器,就是一个logger对象
    logger = logging.getLogger('logger')
    
    # 1.设置logger日志级别
    logger.setLevel(logging.DEBUG)
    
    # 2.创建一个输出的处理器,让它输入到控制台
    sh = logging.StreamHandler()
    
    # 3.把输出处理器添加到日志器中
    logger.addHandler(sh)
    
    # 输出日志信息
    logger.debug('输出debug级别的日志')
    logger.info('输出info级别的日志')
    logger.warning('输出warning级别的日志')
    logger.error('输出error级别的日志')
    logger.critical('输出critical级别的日志')
    
    """
    # 右键执行代码
    # 结果如下:
    输出debug级别的日志
    输出info级别的日志
    输出warning级别的日志
    输出error级别的日志
    输出critical级别的日志
    """

    说明:

    当我们设置好logger日志级别后,执行代码,发现还是和上面一样,只输出了warning级别日志。

    这个时候我们是改变了logger默认设置,就需要创建一个日志处理器Handler,来处理输出这个自定义logger对象的日志输出。

    3、formatter类用法

    formatter类:formatter对象用来输出格式化字符串,也叫做格式器。

    构造方法如下:

    logging.Formatter.__init__(fmt=None, datefmt=None)

    其中:

    fmt:指定信息(日志)的格式化字符串,如不设定则使用信息的原始字符串。

    datefmt:指定日期的格式化字符串,如不设定则使用默认格式"%Y-%m-%d %H:%M:%S"

    logging模块中定义好的可以用于format格式字符串说明:

    字段/属性名称 使用格式 描述
    asctime %(asctime)s 将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒。
    name %(name)s 所使用的日志器名称,默认是root,因为默认使用的是 rootLogger
    filename %(filename)s 调用日志输出函数的模块的文件名; pathname的文件名部分,包含文件后缀。
    funcName %(funcName)s 由哪个function发出的log, 调用日志输出函数的函数名。
    levelname %(levelname)s 日志的最终等级(被filter修改后的)。
    message %(message)s 日志信息, 日志记录的文本内容。
    lineno %(lineno)d 当前日志的行号, 调用日志输出函数的语句所在的代码行。
    levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)。
    pathname %(pathname)s 完整路径 ,调用日志输出函数的模块的完整路径名,可能没有。
    process %(process)s 当前进程, 进程ID。可能没有。
    processName %(processName)s 进程名称,Python 3.1新增。
    thread %(thread)s 当前线程, 线程ID。可能没有。
    threadName %(thread)s 线程名称。
    module %(module)s 调用日志输出函数的模块名,filename的名称部分,不包含后缀即不包含文件后缀的文件名。
    created %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示; 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值。
    relativeCreated %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数; 日志事件发生的时间相对于logging模块加载时间的相对毫秒数。
    msecs %(msecs)d 日志事件发生事件的毫秒部分。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒部分,可以用这个加上。

    示例:

    python
    """
    logging模块是Python的内置模块,不需要安装。
    
    步骤:
    1,定义格式器
    2,把格式器输入处理器中
    """
    # 导入logging模块
    import logging
    
    # 创建一个日志器,就是一个logger对象
    logger = logging.getLogger('logger')
    
    # 设置logger输入级别
    logger.setLevel(logging.DEBUG)
    
    # 1.创建日志格式器
    formator = logging.Formatter(fmt="%(asctime)s [ %(filename)s ]  %(lineno)d行 | [ %(levelname)s ] | [%(message)s]",
                                 datefmt="%Y/%m/%d/%X")
    
    # 创建一个输出的处理器,让它输入到控制台
    sh = logging.StreamHandler()
    
    # 把输出处理器添加到日志器中
    logger.addHandler(sh)
    
    # 2.给处理器添加格式器
    sh.setFormatter(formator)
    
    # 输出日志信息
    logger.debug('输出debug级别的日志')
    logger.info('输出info级别的日志')
    logger.warning('输出warning级别的日志')
    logger.error('输出error级别的日志')
    logger.critical('输出critical级别的日志')
    
    """
    # 右键执行代码
    # 结果如下:
    2021/01/15/03:15:44 [ demo_log2.py ]  27行 | [ DEBUG ] | [输出debug级别的日志]
    2021/01/15/03:15:44 [ demo_log2.py ]  28行 | [ INFO ] | [输出info级别的日志]
    2021/01/15/03:15:44 [ demo_log2.py ]  29行 | [ WARNING ] | [输出warning级别的日志]
    2021/01/15/03:15:44 [ demo_log2.py ]  30行 | [ ERROR ] | [输出error级别的日志]
    2021/01/15/03:15:44 [ demo_log2.py ]  31行 | [ CRITICAL ] | [输出critical级别的日志]
    """

    4、filter类用法

    filter类filter是一个过滤器,可以实现比loggerhandle更细致灵活的过滤功能。

    设置只输出符合过滤条件的日志记录,提供给Logger类和Handler类使用。

    Logger类默认过滤具有相同前缀的所有日志记录。

    Logger只有在处理日志记录时即时检查Filter,所以继承Logger不会检查Filter

    Handler首先注册Filter,然后在处理后续日志记录时检查。

    首先定义logging.Filter的扩展类,并在其中实现def filter(self, record)方法。然后创建定制Filter类的实例,并通过addFilter()方法附加到LoggerHandler

    参考:https://www.sohu.com/a/280170254_697896


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/15965174.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    电脑重装系统后硬盘消失要如何解决
    如何高效获取电商数据
    ES6 新特性:Class 的继承
    IIS配置SSL,根据pem和key生成pfx,openssl的版本不能太高
    【MySQL】高级数据过滤
    记录Manjaro Linux安装nvidia显卡驱动失败的经历
    Mysql按照中文首字母排序
    SpringBoot3.x原生镜像-Native Image实践
    数学与经济管理
    网络安全入门学习资源汇总
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/15965174.html