【问题标题】:Logging configuring MemoryHandler in config file在配置文件中记录配置 MemoryHandler
【发布时间】:2022-01-11 16:02:12
【问题描述】:

我想配置一个 MemoryHandler,以后可以将它部署到一个变量中。但是,我不知道将目标设置为什么,因此我可以打印包含所有错误的变量。

这是我当前的配置文件:

[loggers]
keys=root

[handlers]
keys=memoryHandler

[formatters]
keys=memoryFormatter

[logger_root]
level=DEBUG
handlers=memoryHandler

[handler_memoryHandler]
class=handlers.MemoryHandler
formatter=memoryFormatter
args=(10, DEBUG)
level=ERROR
; target=

[formatter_memoryFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

这是我当前的脚本:

import logging.config

logging.config.fileConfig(fname=r'./logger_config2.conf')
logging.info('INFO')

我想要这样的东西(伪代码):

my_flush_contents = memoryHandler.flush()

【问题讨论】:

  • 您需要为该处理程序显式调用setTarget,即logging.setTarget(otherHandler)。目标参数otherHandler 是另一个处理程序,例如 FileHandler、StreamHandler 等。请参阅文档:docs.python.org/3/library/logging.handlers.html#memoryhandler
  • @Nechoj 感谢您的回答。但是,如何将输出分配给变量?
  • 见下方答案

标签: python logging


【解决方案1】:

根据 StreamHandler 的文档,实现登录变量/缓冲区要求的方法是:

import logging
import logging.config


class MyLogStream:
    """ class that implements a stream logging into a string buffer"""
    
    def __init__(self):
        self.buffer = ""

    def write(self, message):
        self.buffer += message

    def flush(self):
        # anything you like what should happen to buffer when .flush() has been called
        pass

    def get_buffer(self):
        return self.buffer



logging.config.fileConfig(fname=r'./logger_config2.conf')
logger = logging.getLogger()  # root logger

my_log_stream = MyLogStream()

for handler in logger.handlers:
    handler.setStream(my_log_stream)
    
logger.info('test')

print(my_log_stream.get_buffer())

您的配置文件需要修改:

[loggers]
keys=root

[handlers]
keys=streamHandler

[formatters]
keys=streamFormatter

[logger_root]
level=DEBUG
handlers=streamHandler

[handler_streamHandler]
class=StreamHandler
level=DEBUG
formatter=streamFormatter

[formatter_streamFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

不再需要 MemoryHandler。

【讨论】:

  • 感谢您的回答!我最终采用了另一种方法,但您的回答帮助我找出了另一种方法,从而将您的方法标记为已接受的答案。
【解决方案2】:

这就是我最终的方式。

# Config for the root logger
class RootLogger:
    def __init__(self):
        self.root_logger = self.load_config_from_yaml()

    @staticmethod
    def load_config_from_yaml():
        """
        Fetch the config in the yaml file to set up the console and file handlers
        Returns:
            logger object
        """
        with open('./logger_config1.yml', 'r') as config_yaml:
            config = yaml.safe_load(config_yaml.read())
            logging.config.dictConfig(config)
            return logging.getLogger(__name__)


# Buffer IO for error mail sending must be created manually
class BufferIO(logging.StreamHandler):
    string_io = io.StringIO()

    def __init__(self):
        super().__init__(self.string_io)
        self.setLevel(logging.ERROR)
        self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    def flush_log(self):
        """
        Fetch the string in the variable, close the IO and return the results.
        Returns:
        str
        """
        log_content = self.string_io.getvalue()
        self.string_io.close()
        return log_content


# Main class for logging
class Log(RootLogger, BufferIO):
    buffer_io = BufferIO()

    def __init__(self):
        super().__init__()
        self.add_buffer_io_handler()

    def add_buffer_io_handler(self):
        """
        If not added, the
        Returns:

        """
        self.root_logger.addHandler(self.buffer_io)

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多