parent
02d87c841c
commit
8eca1409b6
@ -0,0 +1,109 @@ |
|||||||
|
import os |
||||||
|
import threading |
||||||
|
import datetime |
||||||
|
import logging |
||||||
|
|
||||||
|
|
||||||
|
class ControlledLogger: |
||||||
|
""" |
||||||
|
A simple logger that only writes to file when the 'write' method is called. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self, logger_name, log_dir): |
||||||
|
""" |
||||||
|
:param logger_name: The name of the logger and logfile |
||||||
|
:param log_dir: The directory in which to save this log file (can be abs or relative). |
||||||
|
""" |
||||||
|
if log_dir.endswith('/'): |
||||||
|
log_dir = log_dir[:-1] |
||||||
|
os.makedirs(log_dir, exist_ok=True) |
||||||
|
handler = logging.FileHandler(f"{log_dir}/{logger_name}") |
||||||
|
handler.setFormatter(logging.Formatter('%(levelname)s - %(message)s')) |
||||||
|
|
||||||
|
self.logger = logging.getLogger(logger_name) |
||||||
|
self.logger.addHandler(handler) |
||||||
|
self._clear() |
||||||
|
|
||||||
|
def _clear(self): |
||||||
|
""" |
||||||
|
Internal method to clear the log buffer. |
||||||
|
|
||||||
|
Note that log buffers are lists to be thread safe. |
||||||
|
""" |
||||||
|
self.info_buffer = [] |
||||||
|
self.debug_buffer = [] |
||||||
|
self.warning_buffer = [] |
||||||
|
self.error_buffer = [] |
||||||
|
|
||||||
|
def info(self, msg): |
||||||
|
""" |
||||||
|
:param msg: The info message to log |
||||||
|
""" |
||||||
|
self.info_buffer.append(f"[{threading.get_ident()}] " |
||||||
|
f"{datetime.datetime.utcnow()} : {msg}") |
||||||
|
|
||||||
|
def debug(self, msg): |
||||||
|
""" |
||||||
|
:param msg: The debug message to log |
||||||
|
""" |
||||||
|
self.debug_buffer.append(f"[{threading.get_ident()}] " |
||||||
|
f"{datetime.datetime.utcnow()} : {msg}") |
||||||
|
|
||||||
|
def warning(self, msg): |
||||||
|
""" |
||||||
|
:param msg: The warning message to log |
||||||
|
""" |
||||||
|
self.warning_buffer.append(f"[{threading.get_ident()}] " |
||||||
|
f"{datetime.datetime.utcnow()} : {msg}") |
||||||
|
|
||||||
|
def error(self, msg): |
||||||
|
""" |
||||||
|
:param msg: The error message to log |
||||||
|
""" |
||||||
|
self.error_buffer.append(f"[{threading.get_ident()}] " |
||||||
|
f"{datetime.datetime.utcnow()} : {msg}") |
||||||
|
|
||||||
|
def print_info(self): |
||||||
|
""" |
||||||
|
Prints the current info buffer but does not flush it to log file. |
||||||
|
""" |
||||||
|
print('\n'.join(self.info_buffer)) |
||||||
|
|
||||||
|
def print_debug(self): |
||||||
|
""" |
||||||
|
Prints the current debug buffer but does not flush it to log file. |
||||||
|
""" |
||||||
|
print('\n'.join(self.debug_buffer)) |
||||||
|
|
||||||
|
def print_warning(self): |
||||||
|
""" |
||||||
|
Prints the current warning buffer but does not flush it to log file. |
||||||
|
""" |
||||||
|
print('\n'.join(self.warning_buffer)) |
||||||
|
|
||||||
|
def print_error(self): |
||||||
|
""" |
||||||
|
Prints the current error buffer but does not flush it to log file. |
||||||
|
""" |
||||||
|
print('\n'.join(self.error_buffer)) |
||||||
|
|
||||||
|
def write(self): |
||||||
|
""" |
||||||
|
Flushes ALL of the log buffers to the log file via the logger. |
||||||
|
|
||||||
|
Note that directly after this method call, the respective prints will print |
||||||
|
nothing since all log messages are flushed to file. |
||||||
|
""" |
||||||
|
if self.info_buffer: |
||||||
|
self.logger.setLevel(logging.INFO) |
||||||
|
self.logger.info('\n'.join(self.info_buffer)) |
||||||
|
if self.debug_buffer: |
||||||
|
self.logger.setLevel(logging.DEBUG) |
||||||
|
self.logger.debug('\n'.join(self.debug_buffer)) |
||||||
|
if self.warning_buffer: |
||||||
|
self.logger.setLevel(logging.WARNING) |
||||||
|
self.logger.warning('\n'.join(self.warning_buffer)) |
||||||
|
if self.error_buffer: |
||||||
|
self.logger.setLevel(logging.ERROR) |
||||||
|
self.logger.error('\n'.join(self.error_buffer)) |
||||||
|
self._clear() |
Loading…
Reference in new issue