bench_executor.logger
This module contains the Logger class which is responsible for logging. This class is a small wrapper around the Python logging module to automatically configure the loggers and handle unittest logging.
1#!/usr/bin/env python3 2 3""" 4This module contains the Logger class which is responsible for logging. 5This class is a small wrapper around the Python logging module to automatically 6configure the loggers and handle unittest logging. 7""" 8 9import os 10import sys 11import logging 12 13LOG_FILE_NAME = 'log.txt' 14LOGGER_FORMAT_FILE = '[%(asctime)s] %(levelname)-8s %(message)-s' 15LOGGER_FORMAT_CONSOLE = '%(levelname)s: %(message)s' 16 17 18class Logger: 19 """Log messages to a log file and console.""" 20 21 def __init__(self, name: str, directory: str, verbose: bool): 22 """Creates an instance of the Logger class. 23 24 During unittests, the `UNITTEST` environment variable is set which 25 disables the console logger. 26 27 Parameters 28 ---------- 29 name : str 30 Name of the logger 31 directory : str 32 The path to the directory where the logs must be stored. 33 verbose : bool 34 Enable verbose logs 35 """ 36 self._logger = logging.getLogger(name) 37 38 # Configure logging level 39 self._verbose = verbose 40 level = logging.INFO 41 if self._verbose: 42 level = logging.DEBUG 43 self._logger.setLevel(level) 44 45 # Disable default handlers 46 handlers = self._logger.handlers 47 for h in handlers: 48 self._logger.removeHandler(h) 49 50 # Configure handlers 51 directory = os.path.abspath(directory) 52 os.makedirs(directory, exist_ok=True) 53 log_file = logging.FileHandler(os.path.join(directory, LOG_FILE_NAME)) 54 log_file.setLevel(logging.DEBUG) 55 format_file = logging.Formatter(LOGGER_FORMAT_FILE) 56 log_file.setFormatter(format_file) 57 self._logger.addHandler(log_file) 58 59 # Silence console logging during unittests, logs are available in the 60 # log file anyway 61 if os.environ.get('UNITTEST') is None: 62 log_console = logging.StreamHandler(sys.stderr) 63 log_console.setLevel(level) 64 format_console = logging.Formatter(LOGGER_FORMAT_CONSOLE) 65 log_console.setFormatter(format_console) 66 self._logger.addHandler(log_console) 67 68 def __del__(self): 69 """Close any handlers if needed""" 70 handlers = self._logger.handlers 71 for h in handlers: 72 try: 73 h.close() 74 except AttributeError: 75 pass 76 self._logger.removeHandler(h) 77 78 @property 79 def verbose(self) -> bool: 80 """Verbose logging enabled. 81 82 Returns 83 ------- 84 verbose : bool 85 Verbose logging enabled or not. 86 """ 87 return self._verbose 88 89 def debug(self, msg): 90 """Log a message with level DEBUG.""" 91 self._logger.debug(msg) 92 93 def info(self, msg): 94 """Log a message with level INFO.""" 95 self._logger.info(msg) 96 97 def warning(self, msg): 98 """Log a message with level WARNING.""" 99 self._logger.warning(msg) 100 101 def error(self, msg): 102 """Log a message with level ERROR.""" 103 self._logger.error(msg)
LOG_FILE_NAME =
'log.txt'
LOGGER_FORMAT_FILE =
'[%(asctime)s] %(levelname)-8s %(message)-s'
LOGGER_FORMAT_CONSOLE =
'%(levelname)s: %(message)s'
class
Logger:
19class Logger: 20 """Log messages to a log file and console.""" 21 22 def __init__(self, name: str, directory: str, verbose: bool): 23 """Creates an instance of the Logger class. 24 25 During unittests, the `UNITTEST` environment variable is set which 26 disables the console logger. 27 28 Parameters 29 ---------- 30 name : str 31 Name of the logger 32 directory : str 33 The path to the directory where the logs must be stored. 34 verbose : bool 35 Enable verbose logs 36 """ 37 self._logger = logging.getLogger(name) 38 39 # Configure logging level 40 self._verbose = verbose 41 level = logging.INFO 42 if self._verbose: 43 level = logging.DEBUG 44 self._logger.setLevel(level) 45 46 # Disable default handlers 47 handlers = self._logger.handlers 48 for h in handlers: 49 self._logger.removeHandler(h) 50 51 # Configure handlers 52 directory = os.path.abspath(directory) 53 os.makedirs(directory, exist_ok=True) 54 log_file = logging.FileHandler(os.path.join(directory, LOG_FILE_NAME)) 55 log_file.setLevel(logging.DEBUG) 56 format_file = logging.Formatter(LOGGER_FORMAT_FILE) 57 log_file.setFormatter(format_file) 58 self._logger.addHandler(log_file) 59 60 # Silence console logging during unittests, logs are available in the 61 # log file anyway 62 if os.environ.get('UNITTEST') is None: 63 log_console = logging.StreamHandler(sys.stderr) 64 log_console.setLevel(level) 65 format_console = logging.Formatter(LOGGER_FORMAT_CONSOLE) 66 log_console.setFormatter(format_console) 67 self._logger.addHandler(log_console) 68 69 def __del__(self): 70 """Close any handlers if needed""" 71 handlers = self._logger.handlers 72 for h in handlers: 73 try: 74 h.close() 75 except AttributeError: 76 pass 77 self._logger.removeHandler(h) 78 79 @property 80 def verbose(self) -> bool: 81 """Verbose logging enabled. 82 83 Returns 84 ------- 85 verbose : bool 86 Verbose logging enabled or not. 87 """ 88 return self._verbose 89 90 def debug(self, msg): 91 """Log a message with level DEBUG.""" 92 self._logger.debug(msg) 93 94 def info(self, msg): 95 """Log a message with level INFO.""" 96 self._logger.info(msg) 97 98 def warning(self, msg): 99 """Log a message with level WARNING.""" 100 self._logger.warning(msg) 101 102 def error(self, msg): 103 """Log a message with level ERROR.""" 104 self._logger.error(msg)
Log messages to a log file and console.
Logger(name: str, directory: str, verbose: bool)
22 def __init__(self, name: str, directory: str, verbose: bool): 23 """Creates an instance of the Logger class. 24 25 During unittests, the `UNITTEST` environment variable is set which 26 disables the console logger. 27 28 Parameters 29 ---------- 30 name : str 31 Name of the logger 32 directory : str 33 The path to the directory where the logs must be stored. 34 verbose : bool 35 Enable verbose logs 36 """ 37 self._logger = logging.getLogger(name) 38 39 # Configure logging level 40 self._verbose = verbose 41 level = logging.INFO 42 if self._verbose: 43 level = logging.DEBUG 44 self._logger.setLevel(level) 45 46 # Disable default handlers 47 handlers = self._logger.handlers 48 for h in handlers: 49 self._logger.removeHandler(h) 50 51 # Configure handlers 52 directory = os.path.abspath(directory) 53 os.makedirs(directory, exist_ok=True) 54 log_file = logging.FileHandler(os.path.join(directory, LOG_FILE_NAME)) 55 log_file.setLevel(logging.DEBUG) 56 format_file = logging.Formatter(LOGGER_FORMAT_FILE) 57 log_file.setFormatter(format_file) 58 self._logger.addHandler(log_file) 59 60 # Silence console logging during unittests, logs are available in the 61 # log file anyway 62 if os.environ.get('UNITTEST') is None: 63 log_console = logging.StreamHandler(sys.stderr) 64 log_console.setLevel(level) 65 format_console = logging.Formatter(LOGGER_FORMAT_CONSOLE) 66 log_console.setFormatter(format_console) 67 self._logger.addHandler(log_console)
Creates an instance of the Logger class.
During unittests, the UNITTEST
environment variable is set which
disables the console logger.
Parameters
- name (str): Name of the logger
- directory (str): The path to the directory where the logs must be stored.
- verbose (bool): Enable verbose logs
verbose: bool
79 @property 80 def verbose(self) -> bool: 81 """Verbose logging enabled. 82 83 Returns 84 ------- 85 verbose : bool 86 Verbose logging enabled or not. 87 """ 88 return self._verbose
Verbose logging enabled.
Returns
- verbose (bool): Verbose logging enabled or not.