Quick Recipe to have multiple logger and use the StringIO as storage
Note:
This is an customized version of @mhawke Answer ---> HERE
I needed to have multiple log going each one to do its things, here is a simple script that does that.
from io import StringIO
from datetime import date
# Formatter
LOG_FORMAT = '| %(asctime)s | %(name)s-%(levelname)s: %(message)s '
FORMATTER = logging.Formatter(LOG_FORMAT)
# ------- MAIN LOGGER
main_handler = logging.StreamHandler()
main_handler.setLevel(logging.WARNING)
main_handler.setFormatter(FORMATTER)
# ------- FILE LOGGER
file_handler = logging.FileHandler(f'log_{date.strftime(date.today(), "%Y-%m-%d")}.log')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(FORMATTER)
# ------- SECONDARY STREAMER (HOLDS ALL THE LOGS FOR RETRIEVE LATER) LOGGER
streamer = StringIO()
stream_handler = logging.StreamHandler(stream=streamer)
stream_handler.setFormatter(FORMATTER)
# Root Logger
logging.basicConfig(level=10, handlers=[main_handler, file_handler, stream_handler]) # Add handlers to Logger
_logger = logging.getLogger(__name__)
_logger.log(10, "DEBUG MESSAGE")
_logger.log(20, "INFO MESSAGE")
_logger.log(30, "WARNING MESSAGE")
_logger.log(40, "ERROR!")
_logger.log(50, "CRITICAL")
print('==='*15)
print('\nGetting All logs from StringIO')
print(streamer.getvalue())
Clearing The Logs from StringIO
In addition, I needed to clear the Data an start from 0 again. The easiest way and faster by performance is just create a new StringIO instance and attach it to the StreamHandler instance.
new_streamer = StringIO() # Creating the new instance
stream_handler.setStream(new_streamer) # here we assign it to the logger
_logger.info("New Message")
_logger.info("New Message")
_logger.info("New Message")
print(new_streamer.getvalue()) # New data
Another way is to 'clear' the Stream, but as per this other **StackOverflow Answer by @Chris Morgan is less performant.
# Python 3
streamer.truncate(0)
streamer.seek(0)
_logger.info("New Message")
_logger.info("New Message")
_logger.info("New Message")
print(streamer.getvalue())
# Python 2
streamer.truncate(0)
_logger.info("New Message")
_logger.info("New Message")
_logger.info("New Message")
print(streamer.getvalue())
Documentation