zoukankan      html  css  js  c++  java
  • Python中logging模块的基本用法

    本文首发于:行者AI

    在开发项目时,我们不可能将所有的信息都打印在控制台中。我们可以使用Python标准库提供的logging API来处理。相比print,logging模块提供了许多强大而灵活的功能。比如:可以通过设置不同的日志等级,只输出重要信息,而不必显示大量的调式信息;print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据,而logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。

    1. logging模块基本信息

    1.1 日志等级

    logging函数默认定义了5个日志等级,它允许开发人员自定义日志等级,但是并不推荐。

    日志等级(level)) 描述
    DEBUG 最详细的日志信息,典型应用场景是 问题诊断
    INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
    WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
    ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
    CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

    :日志等级从上到下依次升高 DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志信息依次减少;当指定一个日志级别之后,会记录大于或等于这个日志级别的日志信息,小于的将会被丢弃;默认打印的日志等级是 WARNING ,当日志等级设置为 WARNING 或之上时才被跟踪。

    1.2 日志字段信与格式

    一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:

    • 事件发生时间
    • 事件发生位置
    • 事件的严重程度
    • 日志级别、事件内容等其他内容

    :输出一条日志时,日志内容和日志级别是需要开发人员明确指定的;对于而其它字段信息,只需要是否显示在日志中就可以了。

    2. logging模块的使用方式

    2.1 两种记录日志方式

    (1)使用logging提供的模块级别函数
    (2)使用logging日志系统的四大组件

    2.2 使用logging提供的模块级别函数详细说明

    (1)函数描述:

    函数 描述
    logging.debug(msg, args, *kwargs) 创建一条严重级别为DEBUG的日志记录
    logging.info(msg, args, *kwargs) 创建一条严重级别INFO的日志记录
    logging.warning(msg, args, *kwargs) 创建一条严重级别为WARNING的日志记录
    logging.error(msg, args, *kwargs) 创建一条严重级别为ERROR的日志记录
    logging.critical(msg, args, *kwargs) 创建一条严重级别为CRITICAL的日志记录
    logging.log(level, args, *kwargs) 创建一条严重级别为level的日志记录
    logging.basicConfig(**kwargs) 对root logger进行一次性配置

    :其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、 “日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。

    (2)实例:

    import logging
    def ex_logging():
        logging.debug("日志级别:DEBUG")
    	logging.info("日志级别:INFO")
    	logging.warning("日志级别:WARNING")
      	logging.error("日志级别:ERROR")
     	logging.critical("日志级别:CRITICAL")
    ex_logging()
    

    (3)实际结果:

    WARNING:root:日志级别:WARNING
    ERROR:root:日志级别:ERROR
    CRITICAL:root:日志级别:CRITICAL
    

    :默认打印的日志等级是 WARNING ,所以实际结果中只打印出了WARNING 或WARNING级别之上的日志。

    2.3 使用logging日志系统的四大组件

    组件描述:

    组件名称 类名 描述
    日志器 loggers 提供应用程序代码直接使用的接口
    处理器 handlers 用于将日志记录发送到指定的目的位置
    过滤器 filters 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其他的日志记录将会被忽略)
    格式器 formatters 用于控制日志信息的最终输出格式

    2.4 日志器 - Logger

    (1)Logger是一个树形层级结构,在使用接口debug、info、warning、error、critical之前必须创建Logger实例;

    (2)创建方式:

    logger = logging.getLogger(logger_name)
    

    (3)创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler:

    logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
    logger.addHandler(handler_name) # 为Logger实例增加一个处理器
    logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器
    

    2.5 处理器 - Handler

    (1)Handler 处理器类型有很多种,比较常用的有三个:StreamHandler、FileHandler、NullHandler。

    (2)创建方式:

    # StreamHandler创建方式
    sh = logging.StreamHandler(stream=None)
    # FileHandler创建方式
    # fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
    # NullHandler:NullHandler类位于核心logging包,不做任何的格式化或者输出。本质上它是个“什么都不做”的handler,由库开发者使用。 
    

    (3)创建 StreamHandler 之后,可以通过使用以下方法设置日志级别,设置格式化器 Formatter,增加或删除过滤器 Filter。

    ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略
    ch.setFormatter(formatter_name) # 设置一个格式化器formatter
    ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个
    ch.removeFilter(filter_name) # 删除一个过滤器
    

    2.6 过滤器 - filters

    (1)Filter过滤器基类,它只允许某个logger层级下的日志事件通过过滤。

    (2)一条日志信息被输出要经过以下几次过滤:日志器等级过滤、日志器的过滤器过滤、日志器的处理器等级过滤、日志器的处理器的过滤器过滤。

    (3)创建方式:

    filter = logging.Filter(name='')
    

    2.7 格式化器 - Formatter

    (1)使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

    (2)创建方法:

    formatter = logging.Formatter(fmt=None, datefmt=None)
    # fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。
    

    2.8 组件之间的关系

    (1)日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,不同的处理器(handler)可以将日志输出到不同的位置。

    (2)日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置。

    (3)每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志。

    (4)每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

    总结以上内容:Logger 可以包含一个或多个 Handler 和 Filter,即:LoggerFilter,即:Logger 与 Handler 或 Fitler 是一对多的关系;一个 Logger 实例可以新增多个 Handler,一个 Handler 可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

    3. 代码的实现与具体应用

    可以通过以下3种方法来配置logging:使用python代码创建loggers,handlers和formatters并分别调用它们的配置函数,创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容,创建一个包含配置信息的dict,然后把它传递给dictConfig()函数;

    3.1 使用python代码实现日志配置

    (1)Python代码展示:

    import logging
    import sys
    # 创建日志器logger并将其日志级别设置为DEBUG
    logger = logging.getLogger("python_config_logger")
    logger.setLevel(logging.DEBUG)
    # 创建一个流处理器handler并将其日志级别设置为DEBUG
    handler = logging.StreamHandler(sys.stdout)
    handler.setLevel(logging.DEBUG)
    # 创建一个格式化器formatter并将其添加到处理器handler中
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    # 为日志器logger添加上面创建好的处理器handler
    logger.addHandler(handler)
    # 将日志打印在控制台
    logger.debug('打印日志级别:debug')
    logger.info('打印日志级别:info')
    logger.warning('打印日志级别:warning')
    logger.error('打印日志级别:error')
    logger.critical('打印日志级别:critical') 
    

    (2)实际结果:

    2021-02-24 17:13:44,644 - python_config_logger - DEBUG - 打印日志级别:debug
    2021-02-24 17:13:44,644 - python_config_logger - INFO - 打印日志级别:info
    2021-02-24 17:13:44,644 - python_config_logger - WARNING - 打印日志级别:warning
    2021-02-24 17:13:44,645 - python_config_logger - ERROR - 打印日志级别:error
    2021-02-24 17:13:44,645 - python_config_logger - CRITICAL - 打印日志级别:critical
    

    3.2 使用配置文件和fileConfig()函数实现日志配置

    (1)Python代码展示:

    import logging.config
    # 读取日志配置文件内容
    logging.config.fileConfig('logging.conf')
    # 创建一个日志器logger
    logger = logging.getLogger('simpleExample')
    # 将日志打印在控制台
    logger.debug('打印日志级别:debug')
    logger.info('打印日志级别:info')
    logger.warning('打印日志级别:warning')
    logger.error('打印日志级别:error')
    logger.critical('打印日志级别:critical')
    

    (2)logging.conf配置文件内容:

    [loggers]
    keys=root,simpleExample
    # 测试
    [handlers]
    keys=fileHandler,consoleHandler
    [formatters]
    keys=simpleFormatter
    [logger_root]
    level=DEBUG
    handlers=fileHandler
    [logger_simpleExample]
    level=DEBUG
    handlers=consoleHandler
    qualname=simpleExample
    propagate=0
    [handler_consoleHandler]
    class=StreamHandler
    args=(sys.stdout,)
    level=DEBUG
    formatter=simpleFormatter
    [handler_fileHandler]
    class=FileHandler
    args=('logging.log', 'a')
    level=ERROR
    formatter=simpleFormatter
    [formatter_simpleFormatter]
    format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    datefmt=
    

    (3)实际结果:

    2021-02-25 15:04:50,644 - simpleExample - DEBUG - 打印日志级别:debug
    2021-02-25 15:04:50,646 - simpleExample - INFO - 打印日志级别:info
    2021-02-25 15:04:50,646 - simpleExample - WARNING - 打印日志级别:warning
    2021-02-25 15:04:50,646 - simpleExample - ERROR - 打印日志级别:error
    2021-02-25 15:04:50,646 - simpleExample - CRITICAL - 打印日志级别:critical
    

    3.3 使用dict配置信息和dictConfig()函数实现日志配置

    (1)Python代码展示:

    import logging.config
    import logging
    import yaml
    
    # 读取日志配置文件内容
    with open('logging.yml', 'r') as file_logging:
        dict_conf = yaml.load(file_logging, Loader=yaml.FullLoader)
    logging.config.dictConfig(dict_conf)
    # 创建一个日志器logger
    logger = logging.getLogger('simpleExample')
    # 将日志打印在控制台
    logger.debug('打印日志级别:debug')
    logger.info('打印日志级别:info')
    logger.warning('打印日志级别:warning')
    logger.error('打印日志级别:error')
    logger.critical('打印日志级别:critical')  
    

    (2)logging.yml配置文件内容:

    version: 1
    formatters:
      simple:
        format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    handlers:
      console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple
    loggers:
      simpleExample:
        level: DEBUG
        handlers: [console]
        propagate: no
    root:
      level: DEBUG
      handlers: [console]
    
    

    (3)实际结果:

    2021-02-25 15:14:28,822 - simpleExample - DEBUG - 打印日志级别:debug
    2021-02-25 15:14:28,822 - simpleExample - INFO - 打印日志级别:info
    2021-02-25 15:14:28,822 - simpleExample - WARNING - 打印日志级别:warning
    2021-02-25 15:14:28,822 - simpleExample - ERROR - 打印日志级别:error
    2021-02-25 15:14:28,823 - simpleExample - CRITICAL - 打印日志级别:critical
    
    

    4. 总结

    本文只是简单的介绍了python中logging模块的基本使用方法,后期还有许多优化的地方,希望和大家一起来探讨。


    PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!

  • 相关阅读:
    日报10.11
    日报10.9
    日报10.8
    日报10.7
    换马甲啦
    CSP2019知识点整理
    字符logo存档
    QHDYZ模拟赛20191027 提前透题
    数竞大佬jhc的三角函数复习题
    IO流
  • 原文地址:https://www.cnblogs.com/xingzheai/p/14501570.html
Copyright © 2011-2022 走看看