在配置文件中记录配置 MemoryHandler

Logging configuring MemoryHandler in config file

我想配置一个 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()

根据 StreamHandler 的文档,满足您登录 variable/buffer 要求的方法是:

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。

这就是我最终的去向。

# 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)