4

次の例を検討してください。

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」など)を新しいログハンドラー(例のファイルハンドラーなど)に含めるにはどうすればよいですか?

4

1 に答える 1

4

質問に対する私の解決策:

を定義する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)

これは私にとってはうまくいくので、よりエレガントな答えが出るまで、これを正解として受け入れています。

于 2012-10-15T12:54:51.343 に答える