【问题标题】:Using one logger with multiple file handlers that are almost same将一个记录器与几乎相同的多个文件处理程序一起使用
【发布时间】:2020-01-05 18:18:02
【问题描述】:

我有一个服务负责 2 个流:A 和 B。这些流已连接,但我想将每个流记录在不同的日志文件中。

我认为使用以下配置文件:

[loggers]
keys=root,A,B

[handlers]
keys=file_handler

[formatters]
keys=full

[logger_A]
level=INFO
handlers=fileHandler

[logger_B]
level=INFO
handlers=fileHandler

[logger_root]
level=INFO
handlers=fileHandler

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=full
args=('%(logfilename)s','%(permissions)s','%(encoding)s',)

[formatter_full]
format=[%(asctime)s] [%(levelname)s] --- [%(funcName)s] [P%(process)d][%(threadName)s - %(thread)d]- %(message)s
datefmt='%Y-%m-%d %H:%M:%S'

据我了解,没有任何方法可以在运行时动态地将这些参数发送到 fileHandler,对吧?处理程序对所有记录器具有相同的属性,不同之处在于记录器写入的目标文件。

我考虑过配置一个函数,该函数将获取记录器名称和目标文件作为输入并将记录器返回给我 - 这是Logging to two files with different settings 中建议的内容:

import logging
def getLoggerToFile(loggerName,filePath,fileMode,fileHandler=None,level=logging.INFO):
    logger = logging.getLogger(loggerName)
    if len(logger.handlers) > 0:
         return logger
    if(fileHandler is None):
        formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] --- [%(funcName)s] '
                                      '[P%(process)d][%(threadName)s - %(thread)d]- %(message)s')
        fileHandler = logging.FileHandler(filePath, mode=fileMode)
        fileHandler.setFormatter(formatter)

    logger.setLevel(level)
    logger.addHandler(fileHandler)
    return logger

想听听任何其他建议并提出问题:

如果我将使用该函数,并且我将使用相同的记录器名称但具有不同的文件路径两次调用该函数,那么记录器将无法同时写入 2 个不同的文件,对吗?因此,它与创建一个包含 2 个记录器和每个记录器的处理程序/格式化程序的配置文件相同。

【问题讨论】:

  • 你能看一下日志吗?它只是比内置日志库的 POS 更容易配置......请原谅我的咆哮;)
  • 我会检查一下,仍然想为这种情况找到解决方案;)
  • 您只是希望记录器 A 和 B 将其日志写入不同的文件吗?在这种情况下,只需创建两个文件处理程序。还是我误解了你的问题?
  • 我想用同一个记录器将不同的数据记录到两个不同的文件中。你建议的基本上是我实现的功能
  • 你的问题我还不是很清楚,但是你看过log filters吗?您可以创建一个带有两个处理程序的记录器,每个处理程序上都有一个过滤器,以便它只处理您想要的数据

标签: python python-3.x logging


【解决方案1】:

可以使用一个过滤器和两个处理程序来做到这一点。创建一个记录器和两个 FileHandler。向每个处理程序添加一个过滤器,该过滤器只允许消息进入属于该流的文件。您可以使用 LogRecord 中存在的任何信息来决定消息的去向。下面的代码使用 extra kwarg 的日志记录方法,但如果日志中已经存在某些内容来决定不需要的流程。以下是文档相关部分的一些链接: FilterObjects LogRecord attributes

import logging

class Filter:
    def __init__(self, flow):
        self.flow = flow

    def filter(self, record):
        if record.flow == self.flow:
            return True

handlerA = logging.FileHandler('A.log')
handlerB = logging.FileHandler('B.log')
handlerA.addFilter(Filter('a'))
handlerB.addFilter(Filter('b'))

logger = logging.getLogger()
logger.addHandler(handlerA)
logger.addHandler(handlerB)

logger.warning('message A', extra={'flow':'a'}) # writes only to A.log
logger.warning('message B', extra={'flow':'b'}) # writes only to B.log

【讨论】:

  • 不错!这就是我要找的
猜你喜欢
  • 2020-02-19
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多