🎃学习 logging 模块 chatGPT 问答
2023-9-19
| 2023-9-19
0  |  0 分钟
type
status
date
Sep 19, 2023 08:33 AM
slug
summary
tags
category
icon
password

logging.config.fileConfig 配置文件格式

ChatGPT
ChatGPT
在Python的logging模块中,logging.config.fileConfig函数用于从配置文件中读取日志配置。该配置文件通常采用INI文件格式,分为几个主要的部分。
  1. [loggers]: 列出需要配置的logger名称。
  1. [handlers]: 列出需要配置的handler名称。
  1. [formatters]: 列出需要配置的formatter名称。
  1. [logger_名称]: 针对每个特定的logger进行的配置。
  1. [handler_名称]: 针对每个特定的handler进行的配置。
  1. [formatter_名称]: 针对每个特定的formatter进行的配置。
以下是一个简单的示例:

配置文件各部分解释

  • [loggers], [handlers], [formatters]: 列出所有需要配置的logger、handler和formatter的名称。
  • [logger_名称], [handler_名称], [formatter_名称]: 针对每一个特定的logger、handler或formatter进行的详细配置。
    • level: 日志级别。
    • handlers: 关联的handler。
    • qualname: logger的全名(用于区分不同的logger)。
    • propagate: 是否传播消息给父logger。
  • [handler_名称]
    • class: handler的类名。
    • level: 日志级别。
    • formatter: 使用的formatter。
    • args: 传递给handler类初始化方法的参数。
注意,这里的StreamHandlerDEBUG等都是Python logging模块内置的类和常量。你可以根据需要更改它们。
一旦你创建了这个配置文件,你就可以在Python代码中使用logging.config.fileConfig()方法来加载它:
这样,日志系统就会按照logging.ini文件中的配置来执行。这对于需要可配置和灵活的日志处理非常有用。
S
You

如上配置中, 如何配置多个 handle

ChatGPT
ChatGPT
logging.config.fileConfig的INI格式配置文件中,配置多个handler主要涉及以下几个步骤:
  1. [handlers]段落中列出所有你想要配置的handler的键(key)。
  1. 为每一个handler创建一个单独的[handler_名称]段落,并进行具体配置。
  1. [logger_名称]段落中,通过设置handlers字段为一个由逗号分隔的handler键列表,指定该logger应该使用哪些handler。
以下是一个配置了多个handler(一个StreamHandler和一个FileHandler)的示例:

配置解释

  • [handlers]段落中,我添加了两个handler键:consoleHandlerfileHandler
  • 创建了两个独立的handler配置段落:[handler_consoleHandler][handler_fileHandler],并对它们进行了具体的配置。
  • [logger_root][logger_sampleLogger]段落中,我设置了handlers字段为consoleHandler,fileHandler,这意味着这些logger将使用这两个handler来处理日志。
这样,日志既会输出到控制台(通过StreamHandler),也会写入到一个名为logfile.log的文件中(通过FileHandler)。这两个handler都会使用相同的formatter(sampleFormatter)来格式化日志记录。
你只需将这个配置保存为一个INI文件(例如logging.ini),然后在你的Python代码中使用logging.config.fileConfig来加载这个配置文件。这样,你就可以利用多个handler来更灵活地处理日志了。
S
You

可以增加 filter 吗

ChatGPT
ChatGPT
当然,你可以在logging.config.fileConfig的INI格式配置文件中添加日志过滤器(Filter)。但需要注意的是,Python标准库中的logging.config.fileConfig函数对于过滤器的支持相对有限。你可以通过代码来添加过滤器,但在INI配置文件中直接配置过滤器是比较受限的。
以下是一个示例,展示了如何在代码中为通过fileConfig配置的logger添加一个简单的过滤器:
  1. 配置文件(logging.ini):
  1. Python 代码:
在这个示例中,我定义了一个名为MyFilter的自定义过滤器类。这个过滤器仅通过包含“keyword”的日志记录。
然后,我使用logging.config.fileConfig加载了INI格式的配置文件,并获取了一个名为sampleLogger的logger对象。
接着,我创建了MyFilter的一个实例,并使用addFilter方法将其添加到sampleLogger中。
这样,即使我们使用的是通过fileConfig加载的配置,也能成功地为logger添加了一个自定义过滤器。这个过滤器将只允许包含“keyword”的日志消息通过。
S
You

root,sampleLogger 这两个 logging 有什么区别

ChatGPT
ChatGPT
在Python的logging库中,root logger和名为sampleLogger(或其他任何自定义名称)的logger有以下几个主要区别:
  1. 层次结构root logger是所有logger对象的父级。其他所有的logger(例如sampleLogger)都是root logger的后代。这个层次结构允许日志消息在logger之间传播。
  1. 默认行为:如果一个自定义logger(例如sampleLogger)没有被配置或没有关联的handler,那么其日志消息会传播到root logger。root logger默认有一个StreamHandler用于输出日志到控制台。
  1. 配置root logger和sampleLogger可以独立配置。你可以为它们指定不同的日志级别、handler、formatter等。
  1. 名称空间:自定义logger通常用于标识或隔离应用程序的不同部分。例如,你可能会使用一个名为database的logger来处理与数据库相关的日志,而使用一个名为network的logger来处理与网络相关的日志。
  1. 消息传播:你可以通过设置propagate属性来控制日志消息是否从子logger(如sampleLogger)传播到其上级(例如root logger)。默认情况下,propagate设置为True
  1. 多样性与灵活性:自定义logger(如sampleLogger)提供了更多灵活性,因为你可以根据不同的应用程序组件或模块为它们定义不同的行为。

示例

在一个配置文件中:
  • root logger仅处理ERROR级别或以上的日志,并通过consoleHandler输出到控制台。
  • sampleLogger处理DEBUG级别或以上的日志,并通过fileHandler输出到一个文件。
这样,通过使用root和自定义的logger,你可以更细致地控制哪些日志消息被处理和如何被处理。
S
You

上述配置文件中, logger 中的 level 和 handler 的 level 是什么关系

ChatGPT
ChatGPT
在Python的logging配置中,loggerhandler都有一个level设置,但它们起作用的阶段和逻辑有所不同:
  1. Logger Level:当一个日志消息到达某个logger时,首先会检查这个消息的级别是否大于或等于logger自己的级别。如果是,消息会被处理并传递给该logger关联的所有handler;否则,该消息会被忽略。
  1. Handler Level:即使消息通过了logger的级别检查,它还需要通过与之关联的每个handler的级别检查。handler级别用于进一步过滤消息。只有当消息级别大于或等于handler的级别时,该handler才会处理该消息。

逻辑关系:

  • 第一关卡:Logger Level
    • 如果消息级别 ≥ Logger级别,则进入下一关;否则,消息被丢弃。
  • 第二关卡:Handler Level
    • 对于通过第一关卡的消息,还需检查与各个handler相关的级别。如果消息级别 ≥ Handler级别,则由该handler进行处理。

示例:

假设配置文件中有以下设置:
  • 当一个INFO级别的消息到达sampleLogger时,它会被丢弃,因为INFO < WARNING(Logger级别)。
  • 当一个WARNING级别的消息到达sampleLogger时,它会通过Logger级别的检查,但只会被fileHandler处理,因为WARNING < ERRORconsoleHandler的级别)但WARNINGDEBUGfileHandler的级别)。
通过这种方式,loggerhandlerlevel设置提供了两级过滤机制,使得日志系统更加灵活和高效。
技术折腾
  • Python
  • Python 全局变量 局部变量 作用域 说明python 库大全
    目录