Skip to content

Instantly share code, notes, and snippets.

@brake
Created December 19, 2019 12:14
Show Gist options
  • Save brake/768771ba12a9abab81763a7efd33250e to your computer and use it in GitHub Desktop.
Save brake/768771ba12a9abab81763a7efd33250e to your computer and use it in GitHub Desktop.
IO wrapper for intercepting of stdout and stderr into log file managed by logging framework
from contextlib import redirect_stderr, redirect_stdout
from logging import getLogger
from logging_io import LoggingErrorOutput, LoggingInfoOutput
logger = getLogger()
error_output = LoggingErrorOutput(logger)
normal_output = LoggingInfoOutput(logger)
with redirect_stdin(normal_output), redirect_stdout(error_output):
# run code writing to stdin or stdout
# all thah output will be intercepted by logger
# Enjoy!
from abc import ABCMeta, abstractmethod
from io import TextIOBase
from logging import Logger
class LoggingOutput(TextIOBase, metaclass=ABCMeta):
def __init__(self, logger: Logger):
self.logger: Logger = logger
@abstractmethod
def write_to_log(self, message, *args, **kwargs) -> None:
...
def write(self, message: str, *args, **kwargs) -> None:
msg_cleared = message.strip()
if msg_cleared:
self.write_to_log(msg_cleared, *args, **kwargs)
def close(self) -> None:
pass
class LoggingErrorOutput(LoggingOutput):
def __init__(self, logger: Logger):
super().__init__(logger)
def write_to_log(self, message: str, *args, **kwargs) -> None:
self.logger.error(message, *args, **kwargs)
class LoggingInfoOutput(LoggingOutput):
def __init__(self, logger: Logger):
super().__init__(logger)
def write_to_log(self, message: str, *args, **kwargs) -> None:
self.logger.info(message, *args, **kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment