在新的日志记录处理程序中包括以前记录的事件 [英] Including previously logged events in a new logging handler

查看:99
本文介绍了在新的日志记录处理程序中包括以前记录的事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下示例:

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"之后初始化(因为它取决于配置).

With this example, "Log event 1" does not appear in the log file (only in stdout). The log file is inevitably initialized after "Log event 1" (because it's dependent on the configuration).

我的问题是:
如何在新的日志记录处理程序(例如示例中的文件处理程序)中包括以前记录的事件(例如日志事件1")?

My question is:
How do I include previously logged events (such as "Log event 1") in a new logging handler (such as the file handler in the example)?

推荐答案

我对这个问题的解决方案:

My solution for the question:

定义MemoryHandler以处理定义FileHandler之前的所有事件.
定义FileHandler后,将其设置为MemoryHandler的刷新目标并刷新.

Define a MemoryHandler to handle all the events prior to the definition of the FileHandler.
When the FileHandler is defined, set it as the flush target of the MemoryHandler and flush it.

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)

这对我有用,因此我接受它作为正确的答案,直到出现更优雅的答案为止.

This works for me, so I'm accepting this as the correct answer, until a more elegant answer comes along.

这篇关于在新的日志记录处理程序中包括以前记录的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆