Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件

Posted

技术标签:

【中文标题】Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件【英文标题】:Python Custom logging handler to create each log file per key in the dictionary 【发布时间】:2021-05-11 03:02:26 【问题描述】:

我有一本字典,其中包含一些示例数据,如下所示

"screener": "media", "anchor": "media","reader": "media"

我想为字典中的每个键创建一个日志文件。我计划在流式传输作业中使用此日志记录,它将被流式传输中的每个批次重用。在这里,我也计划使用每个键的旋转文件处理程序。

这是我的sn-p

import logging
from logging.handlers import RotatingFileHandler
import time

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

dict_store = "screener": "media", "anchor": "media", "reader": "media"
dict_log_handler = 


def createFileHandler(name):
    handler = RotatingFileHandler(name, maxBytes=2000000000, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)

    return handler


def runBatch():
    print("logging batch")
    for name in dict_store.keys():
        print(name)
        if name in dict_log_handler:
            print(f"getting logger from dict_handler name")
            handler = dict_log_handler[name]
        else:
            handler = createFileHandler(name)
            dict_log_handler[name] = handler

        logger.addHandler(handler)
        logger.info('Hello, world!')
        logger.info('Hello, world!')
        logger.info('Hello, world!')
        logger.info('Hello, world!')
        logger.info('Hello, world!')
        logger.info('Hello, world!')
        logger.removeHandler(handler)
        time.sleep(0.1)


for i in range(0, 3):
    runBatch()

目前正在按预期工作。我只是想在覆盖或创建自定义处理程序中实现类似的东西(比如如果我们传递一个名称,它应该自动执行这些东西)并且总体预期是它不应该影响性能。

问题是,我想将它包装在一个类中并直接使用它。可能吗?

【问题讨论】:

【参考方案1】:

您的问题不清楚您到底想做什么,但如果您的想法是使用多个记录器,如您的代码所示,那么您可以执行以下操作:

logging.getLogger(name) 这是用于访问特定记录器的方法,在您的代码中,您使用相同的记录器,但使用addHandlerremoveHandler 切换到特定记录器。

您可以像这样创建多个记录器:

import logging
from logging.handlers import RotatingFileHandler


dict_store = "screener": "media", "anchor": "media", "reader": "media"


for name in dict_store:
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    handler = RotatingFileHandler(name, maxBytes=2000000000, backupCount=10)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)

    logger.addHandler(handler)

您可以将上述代码包装在您自己的日志记录类/方法中,并根据需要使用它。请记住,这只需要调用一次。

下次可以访问具体的日志,使用记录方法:

logger = logging.getLogger(<logger_name>)
logger.debug("debug")
logger.info("info")
logger.warning("warning")
logger.error("error")
logger.critical("critical")

【讨论】:

"logging.getLogger(name) 这是用于访问特定记录器的方法" 对于普通文件处理程序为 true。但是在旋转文件处理程序的情况下,它使用的是 RotatingFileHandler 方法() 另外你想说的是,“logging.getLogger()”这个语句是getOrcreate吗? 问题是,我想将它包装在一个类中并直接使用它。可能吗?

以上是关于Python 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义java日志文件,最多只包含N个日志记录,而不是以字节为单位的大小

如何自定义 Python 日志记录的时间格式?

在 python 中编写自定义日志处理程序

django 1.3 用于在开发环境中进行调试的日志记录

Python日志记录:如何向LogRecord添加自定义字段,并注册全局回调以设置其值

如何从 Python 日志记录模块获得非阻塞/实时行为? (输出到 PyQt QTextBrowser)