【问题标题】:how to maintain separate log files for each specific log level in python?如何为python中的每个特定日志级别维护单独的日志文件?
【发布时间】:2022-11-01 14:16:33
【问题描述】:

当我在 file_handler 中将级别设置为 INFO 时。我正在将其他日志级别也打印到文件中。 如何将每个日志级别打印到不同的日志文件中。我不想在任何文件中出现重复的日志。有人可以帮忙吗?

import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s : %(name)s :%(levelname)s :%(message)s')
formatter1 = logging.Formatter('%(levelname)s :%(message)s')
file_handler = logging.FileHandler('test_log.log')
file_handler.setLevel(logging.INFO) 
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.WARNING)
stream_handler.setFormatter(formatter1)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.error("this is error")
logger.debug("this is debug")
logger.info("this is info")
logger.critical("this is critical")
logger.warning("this is warning")

我尝试了这个,并将所有其他日志级别也放入日志文件

【问题讨论】:

  • 你为什么要这样做?只需 grep 您的日志以获得您感兴趣的级别。

标签: python python-3.x logging


【解决方案1】:

您登录的所有the levels 都高于​​或处于您的处理程序(INFO)的设置级别,因此这些日志消息将全部出现在您的日志文件中。

您可以写custom filters,这将允许您仅包含某些级别并排除所有级别以上和以下。

可以在处理程序级别上设置过滤器,以允许所有级别都有自己的文件。

一句警告:这不是那么容易做到的原因是因为它违反了惯例。从信息日志文件中省略警告、错误和关键日志可能会使任何查看这些日志的人误以为一切正常。

考虑一下您希望他们分开的根本原因并集思广益,在不违反惯例的情况下实现目标的方法可能是一个值得练习

【讨论】:

  • ..谢谢。我将通过自定义过滤器一次。
【解决方案2】:

日志记录级别确定最低日志记录级别。对于您的情况,过滤器可用于过滤仅通过所需的级别。

这是具有所需更改的示例代码。例如,如果您想记录多个日志级别,您可以将任何过滤逻辑添加到 LoggingLevelFilter

import logging


class LoggingLevelFilter(logging.Filter):
    def __init__(self, logging_level: int):
        super().__init__()
        self.logging_level = logging_level

    def filter(self, record: logging.LogRecord) -> bool:
        return record.levelno == self.logging_level


logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s : %(name)s :%(levelname)s :%(message)s')
formatter1 = logging.Formatter('%(levelname)s :%(message)s')

file_handler = logging.FileHandler('test_log1.log')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
file_handler.addFilter(LoggingLevelFilter(logging.INFO))

stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.WARNING)
stream_handler.setFormatter(formatter1)
stream_handler.addFilter(LoggingLevelFilter(logging.WARNING))

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.error("this is error")
logger.debug("this is debug")
logger.info("this is info")
logger.critical("this is critical")
logger.warning("this is warning")

每个handler 都可以有自己的过滤器。要创建过滤器,需要两个步骤。第一步是创建一个继承自logging.Filter 的类,并在def filter(self, record: logging.LogRecord) 方法中实现过滤逻辑。第二步是使用addFilter() 将过滤器添加到处理程序。

在您的情况下,您希望每个处理程序仅记录特定的日志记录级别(即 INFO、WARNING、ERROR、...)。为此,我创建了一个过滤类,它包含可接受的日志记录级别,并过滤掉所有其他日志记录消息。所以filter 方法只为所需的日志记录级别返回True,为其他所有级别返回False

【讨论】:

  • 你能解释一下你所做的改变吗?
  • 添加了一些解释
猜你喜欢
  • 2019-06-20
  • 2023-01-26
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多