WEB

2024-05-13 1920阅读

目录

一、日志级别

二、基本编程方式

日志输出配置以及参数

三、logging的模块

四、logger记录器与处理器

logger记录器使用函数

logger处理器使用函数

示例:一个记录器分别向不同的处理器输出

五、过滤器

自定义过滤器(过滤关键字)

六、配置文件设置日志模式

七、实际应用(异常捕获输出日志)


一、日志级别

级别编号解释
NOTSET0使用自定义名称获取记录器时,未初始化日志级别,则默认为 NOTSET
DEBUG10详细信息,常用于调试
INFO20程序正常运行过程中产生的一些信息
WARNING30警告用户,虽然程序还在正常工作但有可能发生错误
ERROR40由于更严重的问题,程序已经不能执行一些功能了
CRITICAL50严重错误,程序不能正常运行

二、基本编程方式

logging标准库不是同步输出的日志,为了控制大量的并发日志输出,采用多线程机制进行输出日志。

  • 基本输出函数

    对应着各种级别的日志输出

    logging.debug("debug") logging.info("info") logging.warning("warning") logging.error("error") logging.critical("critical")

  • 基本输出代码

    #-*- coding: utf-8 -*-
    import logging
    # 设置日志输出级别
    logging.basicConfig(level=logging.DEBUG)
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
    logging.critical("critical")

    需要注意的是:编译器默认输出的级别为warning级别,如果没有人为的改变日志输出级别就会屏蔽级别比设置的低的日志。

    WEB

    如图所示,默认设置的级别为warning。

    这里解释一下上面用到的日志默认输出的格式

    1. WARNING:日志级别

    2. root:Logger:实例名称

    3. warning:日志的消息内容

    日志输出配置以及参数

    使用logging.basicConfig()函数可以设置日志的输出格式

    如下是各个常用的参数以及使用说明

    参数名称参数描述
    filename日志输出到文件的文件名
    filemode文件模式,[+]、w[+]、a[+]
    format日志输出的格式
    datefat日志附带日期时间的格式
    style格式占位符,默认为“%”和“
    level设置日志输出级别
    stream定义输出流,用来初始化 StreamHandler 对象,不能filename 参数一起使用,否则会ValueError 异常
    handles定义处理器,用来创建 Handler 对象,不能和 fileame、stream 参数一起使用,否则也会抛出 ValueError异常

    举个简单的使用例子,将日志按照指定的格式输出到文件当中。

    #-*- coding: utf-8 -*-
    import logging
    # 设置basicConfig必须在执行语句的上面,否则不会按照所指示的格式输出
    logging.basicConfig(filename="demo.log",filemode='w',
    format='%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    level=logging.DEBUG
        )
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
    logging.critical("critical")

    其中,format是设置的输出的参数也就是显示在文件当中的格式,每个参数名称都有独特的格式。

    下面就是文件当中输出的格式了

    WEB

    三、logging的模块

    Logger日志,暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效
    LogRecord日志记录器,将日志传到相应的处理器处理。
    Handler处理器, 将(日志记录器产生的)日志记录发送至合适的目的地。
    Filter过滤器, 提供了更好的粒度控制,它可以决定输出哪些日志记录。
    Formatter格式化器, 指明了最终输出中日志记录的布局。

    四、logger记录器与处理器

    日志记录器(Logger)和处理器(Handler)之间的关系可以简单描述为:日志记录器负责生成日志消息,而处理器负责接收和处理这些消息。

    具体来说:

    1. 日志记录器是生成日志消息的组件。它负责接收应用程序中的日志记录请求,并根据消息的严重程度(如调试、信息、警告、错误)将其分发到相应的处理器。

    2. 日志处理器是负责处理日志消息的组件。它接收来自日志记录器的日志消息,并根据预定义的规则将这些消息写入到特定的目的地,如控制台、文件、数据库等。处理器可能会对消息进行格式化、过滤或其他处理,然后将其输出到相应的目的地。

    在典型的日志系统中,一个日志记录器通常会配置多个处理器,以便将日志消息发送到不同的目的地或按照不同的方式处理。例如,可以将调试级别的消息输出到控制台,将错误级别的消息写入到文件,同时将所有消息发送到远程日志服务器以进行集中管理和分析。

    总的来说日志记录器和处理器之间的关系类似是一种生产者-消费者关系:日志记录器产生日志消息,而处理器消费这些消息并将其输出到相应的目的地。

    logger记录器使用函数

    # 获取一个记录器,‘applog’是传入的参数,就是记录器的名称 
    # 返回值是一个记录器对象
    logging.getLogger('applog')
    #设置记录器的全局日志级别
    logger.setLevel(logging.DEBUG)
    # 移除处理器
    logger.removeHandler(handler)

    logger处理器使用函数

    # 创建一个输出到控制台的处理器
    logging.StreamHandler()
    # 创建一个输出到文件的处理器, 并且设置文件名称
    logging.FileHandler('my_app.log')
    # ·······这两个是经常使用的处理器
    #处理器设置其日志级别
    setLevel(logging.DEBUG)
    # 将记录器添加到处理器当中(传入记录器)
    logger.addHandler()

    示例:一个记录器分别向不同的处理器输出

    import logging
    # 创建一个日志记录器
    logger = logging.getLogger('my_app')
    logger.setLevel(logging.DEBUG)  # 设置日志记录器的全局日志级别为DEBUG
    # 创建一个控制台处理器,并设置其日志级别为INFO
    console_handler = logging.StreamHandler()  # 创建一个输出到控制台的处理器
    console_handler.setLevel(logging.INFO)  # 设置处理器的日志级别为INFO
    # 创建一个文件处理器,并设置其日志级别为DEBUG
    file_handler = logging.FileHandler('my_app.log')  # 创建一个输出到文件的处理器
    file_handler.setLevel(logging.DEBUG)  # 设置处理器的日志级别为DEBUG
    # 创建一个格式化器,用于定义日志消息的格式
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console_handler.setFormatter(formatter)  # 将格式化器绑定到控制台处理器
    file_handler.setFormatter(formatter)     # 将格式化器绑定到文件处理器
    # 将处理器添加到日志记录器中
    logger.addHandler(console_handler)  # 将控制台处理器添加到日志记录器
    logger.addHandler(file_handler)     # 将文件处理器添加到日志记录器
    # 模拟应用程序的运行,记录不同级别的日志消息
    logger.debug('This is a debug message')    # 调试级别的消息,将不会被控制台处理器输出
    logger.info('This is an info message')      # 信息级别的消息,将被控制台处理器输出
    logger.warning('This is a warning message') # 警告级别的消息,将被控制台处理器和文件处理器输出
    logger.error('This is an error message')    # 错误级别的消息,将被控制台处理器和文件处理器输出

    在这个例子中:

    • 首先创建了一个名为 my_app 的日志记录器,并设置其全局日志级别为 DEBUG。
    • 然后,我们创建了一个输出到控制台的处理器和一个输出到文件的处理器,并分别设置它们的日志级别为 INFO 和 DEBUG。
    • 还创建了一个格式化器,用于定义日志消息的格式,并将其绑定到两个处理器上。
    • 最后,将这两个处理器添加到日志记录器中,并模拟了应用程序的运行过程,生成了不同级别的日志消息。

      在运行这段代码后,会在控制台上看到信息级别及以上的日志消息,而在当前目录下会生成一个名为 my_app.log 的日志文件,其中包含了所有级别的日志消息。

      WEB

      还可以用不同的记录器分别处理不同的事件,这里就不进行实现了

      五、过滤器

      过滤器(Filters)用于控制哪些日志记录会被输出到日志目标(如文件、控制台等)。通过使用过滤器,你可以基于日志记录的级别、内容或者其他条件来选择性地过滤日志消息。

      过滤器可以作为 Logger、Handler 或者 Formatter 的一部分,它们通过 Filter 类来现。你可以创建自定义的过滤器类来满足特定的过滤需求,也可以使用内置的过滤器类来快速现常见的过滤逻辑。

      最常见的就是以过滤器的名字进行过滤记录器和处理器。

      基础使用的函数(过滤记录器名称)

      #-*- coding: utf-8 -*-
      import logging
      logger = logging.getLogger("one.applog")
      # 定义一个过滤器,参数为命名空间,就是一个字符串“.”为层级关系
      flt = logging.Filter("one")
      # 关联过滤器到记录器上
      logger.addFilter(flt)

      自定义过滤器(过滤关键字)

      #-*- coding: utf-8 -*-
      import logging
      class KeywordFilter(logging.Filter):
          def __init__(self, keyword):
              self.keyword = keyword
          def filter(self, record):
              # 如果日志消息中包含指定的关键字,则过滤该日志消息
              if self.keyword in record.getMessage():
                  return False
              return True
      # 创建一个 Logger 对象
      logger = logging.getLogger('example')
      logger.setLevel(logging.DEBUG)
      # 创建一个输出到控制台的 Handler
      console_handler = logging.StreamHandler()
      console_handler.setLevel(logging.DEBUG)
      # 创建一个自定义过滤器,过滤包含 "error" 关键字的日志消息
      keyword_filter = KeywordFilter("error")
      # 将过滤器添加到 Handler 中
      console_handler.addFilter(keyword_filter)
      # 将 Handler 添加到 Logger 中
      logger.addHandler(console_handler)
      # 输出日志消息
      logger.debug('This is a debug message')
      logger.info('This is an info message')
      logger.warning('This is a warning message')
      logger.error('This is an error message')
      logger.critical('This is a critical message')

      六、配置文件设置日志模式

      [loggers]
      keys=root,applog
      [handlers]
      keys=fileHandler,consoleHandler
      [formatters]
      keys=simpleFormatter
      [logger_root]
      level=DEBUG
      handlers=consoleHandler
      [logger_applog]
      level=DEBUG
      handlers=fileHandler,consoleHandler
      qualname=applog
      propagate=0
      [handler_consoleHandler]
      class=StreamHandler
      args=(sys.stdout,)
      level=DEBUG
      formatter=simpleFormatter
      [handler_fileHandler]
      class=handlers.TimedRotatingFileHandler
      args=('applog.log', 'midnight', 0, 7)
      level=DEBUG
      formatter=simpleFormatter
      [formatter_simpleFormatter]
      format=%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s
      datefmt=%Y-%m-%d %H:%M:%S
      logger.critical("critical")

      logger.conf 文件

      • [loggers]: 定义了日志记录器的名称,其中root是根日志记录器,applog是一个自定义的日志记录器。
      • [handlers]: 定义了处理器的名称,这里有两个处理器,分别是fileHandler和consoleHandler。
      • [formatters]: 定义了格式化器的名称,这里只有一个简单的格式化器simpleFormatter。
      • [logger_root]: 根日志记录器的配置,设置了日志级别为DEBUG,并且使用了consoleHandler处理器。
      • [logger_applog]: 自定义日志记录器的配置,设置了日志级别为DEBUG,并且使用了fileHandler和consoleHandler处理器。qualname参数指定了日志记录器的名称,propagate参数设置为0表示不传播日志消息到父记录器。
      • [handler_consoleHandler]: 控制台处理器的配置,使用了StreamHandler类来将日志消息输出到控制台,设置了日志级别为DEBUG,并且使用了simpleFormatter格式化器。
      • [handler_fileHandler]: 文件处理器的配置,使用了TimedRotatingFileHandler类来将日志消息写入到文件中,设置了日志级别为DEBUG,并且使用了simpleFormatter格式化器。args参数指定了日志文件的名称、备份日志文件的时间间隔和保留备份日志文件的数量。
      • [formatter_simpleFormatter]: 简单格式化器的配置,指定了日志消息的格式和日期时间格式。

        python调用文件

        #-*- coding: utf-8 -*-
        import logging
        import logging.config
        logging.config.fileConfig('logging.conf')
        rootLogger = logging.getLogger()
        rootLogger.debug("rootLogger.debug")
        logger = logging.getLogger('applog')
        logger.debug("logger.debug")

        输出:

        WEB

        conf文件当中设置的是默认记录器只输出到控制台处理器上

        自定义名称记录器输出到文件和控制台处理器上

        七、实际应用(异常捕获输出日志)

        #-*- coding: utf-8 -*-
        import logging
        import logging.config
        # 仍然使用上述的配置
        logging.config.fileConfig('logging.conf')
        rootLogger = logging.getLogger()
        rootLogger.debug("rootLogger.debug")
        logger = logging.getLogger('applog')
        logger.debug("logger.debug")
        a = "abc"
        try:
        # 类型转换异常
            int(a)
        except Exception as e:
            logger.exception(e)

        WEB 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]