Last active
April 30, 2022 08:22
-
-
Save nimaid/9368777e83b0ac513710606d3677a00b to your computer and use it in GitHub Desktop.
A Python `STDOUT` and `STDERR` logger
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Logger module by Ella J. (nimaid) | |
# | |
# This module provides basic logging of STDOUT and STDERR to a text file | |
# Usage: | |
# | |
# import logger | |
# logger.start("/path/to/my/log.txt") | |
# ... | |
# logger.stop() | |
import sys | |
_log = None | |
class _Logger: | |
def __init__(self, file_path): | |
self.path = file_path | |
# Append existing log file | |
self._file = open(self.path, "a") | |
self._stdout_logger = self._LoggerStdout(self._file) | |
self._stderr_logger = self._LoggerStderr(self._file) | |
def __del__(self): | |
# Write a newline to the file | |
self._stdout_logger._file.write("\n") | |
self._stdout_logger._file.flush() | |
self._stdout_logger.__del__() | |
self._stderr_logger.__del__() | |
self._file.close() | |
class _LoggerStdout: | |
def __init__(self, file_in): | |
self._file = file_in | |
self._stdout = sys.stdout | |
sys.stdout = self | |
def __del__(self): | |
sys.stdout = self._stdout | |
def write(self, data): | |
self._stdout.write(data) | |
self._file.write(data) | |
self._file.flush() | |
def flush(self): | |
self._file.flush() | |
class _LoggerStderr: | |
def __init__(self, file_in): | |
self._file = file_in | |
self._stderr = sys.stderr | |
sys.stderr = self | |
def __del__(self): | |
sys.stderr = self._stderr | |
def write(self, data): | |
self._stderr.write(data) | |
self._file.write(data) | |
self._file.flush() | |
def flush(self): | |
self._file.flush() | |
def start(file_path): | |
global _log | |
if _log != None: | |
raise FileExistsError("A log is already running: " + _log.path) | |
else: | |
_log = _Logger(file_path) | |
def stop(): | |
global _log | |
if _log == None: | |
raise FileNotFoundError("No log is currently running.") | |
else: | |
del(_log) | |
_log = None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment