在配置文件中记录配置 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)
我想配置一个 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)