【问题标题】:Python Custom logging handler to create each log file per key in the dictionaryPython 自定义日志记录处理程序,用于为字典中的每个键创建每个日志文件
【发布时间】: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()

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

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

【问题讨论】:

    标签: python logging python-logging log-rotation


    【解决方案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吗?
    • 问题是,我想将它包装在一个类中并直接使用它。可能吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多