python - 在新的日志记录处理程序中包含以前记录的事件

标签 python logging

请考虑以下示例:

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”没有出现在日志文件中(仅在标准输出中)。 日志文件不可避免地在“日志事件 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)

这对我有用,所以我接受它作为正确答案,直到出现更优雅的答案。

关于python - 在新的日志记录处理程序中包含以前记录的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895320/

相关文章:

python - Flask多参数从一个url查询数据库的多列时如何避免多个if语句

elasticsearch - 在kibana中合并多个日志行

python - 仅在作为脚本运行时打印?

logging - Logback FileAppender - 日志文件为空?

python - 在Python程序中查看 float 的真实值

python - 实现两个二维数组之间的加权平均值

python - 在 png 或 pdf 中可视化 scikit-learn/sklearn 多输出决策树回归

python - 当要积分的函数也是积分时,scipy.integrate.quad(有时)会失败

scala - Apache Flink:STDOUT文件在TaskExecutor上不可用

python - 将日志级别设置为 logging.DEBUG 或 logging.INFO 无效