Incorporate previously logged events into a new logging handler

Please consider the following example:

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") 

In this example, "Event Log 1" is not displayed in the log file (only in standard mode). The log file is inevitably initialized after the "log 1 event" (since it depends on the configuration).

My question is:
How to include previously recorded events (for example, "Log event 1") in a new logging handler (for example, the file handler in the example)?

+4
source share
1 answer

My solution for the question:

Define a MemoryHandler to handle all events before defining a FileHandler .
When a FileHandler detected, set it as the target for hiding the MemoryHandler and clear 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 accept this as the correct answer until a more elegant answer appears.

+4
source

Source: https://habr.com/ru/post/1439811/


All Articles