|
import logging |
|
|
|
class CustomStreamLoggingFormatter(logging.Formatter): |
|
""" |
|
Custom log formatter class to colorize log messages based on their level. |
|
""" |
|
|
|
|
|
grey = "\x1b[38;20m" |
|
green = "\x1b[32;20m" |
|
yellow = "\x1b[33;20m" |
|
red = "\x1b[31;20m" |
|
bold_red = "\x1b[31;1m" |
|
reset = "\x1b[0m" |
|
log_format = "%(levelname)s" |
|
|
|
|
|
FORMATS = { |
|
logging.DEBUG: grey + log_format + reset, |
|
logging.INFO: green + log_format + reset, |
|
logging.WARNING: yellow + log_format + reset, |
|
logging.ERROR: red + log_format + reset, |
|
logging.CRITICAL: bold_red + log_format + reset |
|
} |
|
|
|
def format(self, record): |
|
log_fmt = self.FORMATS.get(record.levelno) |
|
formatter = logging.Formatter(log_fmt + " -- %(message)s") |
|
return formatter.format(record) |
|
|
|
class CustomFileLoggingFormatter(logging.Formatter): |
|
""" |
|
Custom log formatter class for file logging. |
|
""" |
|
|
|
log_format = "%(asctime)s - %(levelname)s - %(message)s" |
|
|
|
def format(self, record): |
|
formatter = logging.Formatter(self.log_format) |
|
return formatter.format(record) |
|
|
|
def get_logger(name=__name__, enable_file_logging=False, file_name="app.log"): |
|
""" |
|
Returns a logger object configured with a console handler and optionally a file handler. |
|
|
|
Parameters |
|
---------- |
|
name : str |
|
The name of the logger. |
|
enable_file_logging : bool |
|
Whether to enable file logging. |
|
file_name : str |
|
The name of the log file. |
|
""" |
|
logger = logging.getLogger(name) |
|
logger.setLevel(logging.DEBUG) |
|
|
|
|
|
console_handler = logging.StreamHandler() |
|
console_handler.setFormatter(CustomStreamLoggingFormatter()) |
|
logger.addHandler(console_handler) |
|
|
|
|
|
if enable_file_logging: |
|
file_handler = logging.FileHandler(file_name) |
|
file_handler.setFormatter(CustomFileLoggingFormatter()) |
|
logger.addHandler(file_handler) |
|
|
|
logger.propagate = False |
|
|
|
return logger |
|
|
|
def set_logger_level(logger, level): |
|
""" |
|
Set the logger level based on the input string. |
|
|
|
Parameters |
|
---------- |
|
logger : logging.Logger |
|
The logger object. |
|
level : str |
|
The log level string (DEBUG, INFO, WARNING, ERROR, CRITICAL). |
|
""" |
|
level = level.upper() |
|
if level == "DEBUG": |
|
logger.setLevel(logging.DEBUG) |
|
elif level == "INFO": |
|
logger.setLevel(logging.INFO) |
|
elif level == "WARNING": |
|
logger.setLevel(logging.WARNING) |
|
elif level == "ERROR": |
|
logger.setLevel(logging.ERROR) |
|
elif level == "CRITICAL": |
|
logger.setLevel(logging.CRITICAL) |
|
else: |
|
logger.warning("Invalid log level. Using default level INFO.") |
|
logger.setLevel(logging.INFO) |
|
|
|
|
|
logger = get_logger(__name__, enable_file_logging=True, file_name="app.log") |