请考虑以下示例:
import logging
#create a logger object:
logger = logging.getLogger("MyLogger")
#define a logging handler for the standard output:
stdoutHandler = logging.StreamHandler(sys.stdout)
logger.addHandler(stdoutHandler)
#...
#initialization code with several logging events (for example, loading a configuration file to a 'conf' object)
#...
logger.info("Log event 1")
#after configuration is loaded, a new logging handler is defined for a log file:
fileHandler = logging.FileHandler(conf.get("main","log_file"),'w')
logger.addHandler(fileHandler)
logger.info("Log event 2")
在本例中,“日志事件1”不出现在日志文件中(仅在stdout中)。
日志文件不可避免地在“日志事件1”之后初始化(因为它依赖于配置)。
我的问题是:
如何在新的日志处理程序(如示例中的文件处理程序)中包含以前记录的事件(如“日志事件1”)。
最佳答案
我对这个问题的答案是:
定义一个MemoryHandler
来处理FileHandler
定义之前的所有事件。
定义FileHandler
时,将其设置为MemoryHandler
的刷新目标并刷新它。
import logging
import logging.handlers
#create a logger object:
logger = logging.getLogger("MyLogger")
#define a memory handler:
memHandler = logging.handlers.MemoryHandler(capacity = 1024*10)
logger.addHandler(memHandler)
#...
#initialization code with several logging events (for example, loading a configuration file to a 'conf' object)
#everything is logged by the memory handler
#...
#after configuration is loaded, a new logging handler is defined for a log file:
fileHandler = logging.FileHandler(conf.get("main","log_file"),'w')
#flush the memory handler into the new file handler:
memHandler.setTarget(fileHandler)
memHandler.flush()
memHandler.close()
logger.removeHandler(memHandler)
logger.addHandler(fileHandler)
这对我有效,所以我接受这个作为正确答案,直到一个更优雅的答案出现。