如何在python中为每个特定的日志级别维护单独的日志文件



当我在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")

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

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

这是带有所需更改的示例代码。例如,如果希望记录多个日志记录级别,则可以向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

您登录的所有级别都高于或处于处理程序(INFO(的设置级别,因此这些日志消息都将显示在日志文件中。

您可以编写自定义筛选器,该筛选器将允许您仅包括某些级别,并排除上面和下面的所有级别。

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

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

思考一下你希望他们分开的根本原因,并集思广益,在不违反惯例的情况下实现你的目标,这可能是一项值得付出的努力

最新更新