diff --git a/MyApp.py b/MyApp.py index e26b463..3cd897b 100644 --- a/MyApp.py +++ b/MyApp.py @@ -4,7 +4,7 @@ from helpers import customLogger def test_logging(): - logger = customLogger('customLogger') + logger = customLogger('customLogger','MyApp.log') logger.debug("debug message") logger.info("info message") diff --git a/helpers/__pycache__/customLogger.cpython-39.pyc b/helpers/__pycache__/customLogger.cpython-39.pyc index 6e78fde..bfb0f72 100644 Binary files a/helpers/__pycache__/customLogger.cpython-39.pyc and b/helpers/__pycache__/customLogger.cpython-39.pyc differ diff --git a/helpers/customLogger.py b/helpers/customLogger.py index 586dd59..f0e711a 100644 --- a/helpers/customLogger.py +++ b/helpers/customLogger.py @@ -1,4 +1,5 @@ import logging +from logging.handlers import RotatingFileHandler import sys import re @@ -17,20 +18,25 @@ class ColorCodes: class customLogger(object): _logger = None - def __new__(cls, name:str, level=logging.DEBUG): + def __new__(cls, name:str, log_file_name:str, level=logging.DEBUG): if cls._logger is None: cls._logger = logging.getLogger(name) # Define a Logging Format _format = _format = ColorizedArgsFormatter('%(asctime)s - %(levelname)-8s ' + name + ' %(filename)s in %(funcName)s:%(lineno)d %(message)s') + _file_format = LogfileFormatter('%(asctime)s - %(levelname)-8s ' + name + ' %(filename)s in %(funcName)s:%(lineno)d %(message)s') # Create Console Output _handler = logging.StreamHandler(sys.stdout) + # Create Logfile Output + _file_hanlder = RotatingFileHandler(log_file_name, maxBytes=10240000, backupCount=3 ) # Add the Format to the Handler _handler.setFormatter(_format) + _file_hanlder.setFormatter(_file_format) # Set Loglevel to the Desired One. _handler.setLevel(level) - + _file_hanlder.setLevel(level) # Finally add the Handler to the Logger: cls._logger.addHandler(_handler) + cls._logger.addHandler(_file_hanlder) # Set the Log Level of the Logger. cls._logger.setLevel(level) @@ -102,6 +108,29 @@ class ColorizedArgsFormatter(logging.Formatter): record.args = orig_args return formatted +class LogfileFormatter(logging.Formatter): + + def __init__(self, fmt: str): + super().__init__() + + _format = fmt + self.formatter = logging.Formatter(_format) + + @staticmethod + def rewrite_record(record: logging.LogRecord): + msg = record.msg + record.msg = msg.format(*record.args) + record.args = [] + + def format(self, record): + orig_msg = record.msg + orig_args = record.args + self.rewrite_record(record) + formatted = self.formatter.format(record) + record.msg = orig_msg + record.args = orig_args + return formatted + class BraceFormatStyleFormatter(logging.Formatter): def __init__(self, fmt: str):