From 11f3175ea5a771058b6dafff70aea951ad3e1726 Mon Sep 17 00:00:00 2001 From: Charles Machalow Date: Tue, 6 Jul 2021 18:59:22 -0700 Subject: [PATCH] Add custom formatter ability --- csmlog/__init__.py | 32 ++++++++++++++++++++++++++++---- csmlog/tests/test_csmlog.py | 23 +++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/csmlog/__init__.py b/csmlog/__init__.py index 38039a5..a95373a 100644 --- a/csmlog/__init__.py +++ b/csmlog/__init__.py @@ -1,6 +1,6 @@ ''' This file is part of csmlog. Python logger setup... the way I like it. -MIT License (2020) - Charles Machalow +MIT License (2021) - Charles Machalow ''' import logging @@ -16,17 +16,22 @@ from csmlog.udp_handler import UdpHandler from csmlog.udp_handler_receiver import UdpHandlerReceiver -__version__ = '0.23.0' +__version__ = '0.24.0' +DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s:%(lineno)d - %(levelname)s - %(message)s' class CSMLogger(object): ''' object to wrap logging logic ''' - def __init__(self, appName, clearLogs=False, udpLogging=True, googleSheetShareEmail=None): + def __init__(self, appName, clearLogs=False, udpLogging=True, googleSheetShareEmail=None, formatter=None): self.appName = appName self.udpLogging = udpLogging self.googleSheetShareEmail = googleSheetShareEmail + self._loggers = [] + + # sets self._formatter + self.setFormatter(formatter) if clearLogs: self.clearLogs() @@ -107,7 +112,7 @@ def rotate(self, source, dest): return logger def getFormatter(self): - return logging.Formatter('%(asctime)s - %(name)s:%(lineno)d - %(levelname)s - %(message)s') + return self._formatter def getDefaultSaveDirectory(self): return self.getDefaultSaveDirectoryWithName(self.appName) @@ -136,6 +141,19 @@ def disableConsoleLogging(self): self.parentLogger.removeHandler(self.consoleLoggingStream) self.consoleLoggingStream = None + def setFormatter(self, formatter=None): + if formatter is None: + formatter = logging.Formatter(DEFAULT_LOG_FORMAT) + + if isinstance(formatter, str): + formatter = logging.Formatter(formatter) + + self._formatter = formatter + + for logger in self._loggers: + for handler in logger.handlers: + handler.setFormatter(formatter) + @classmethod def getDefaultSaveDirectoryWithName(cls, appName): if os.name == 'nt': @@ -215,6 +233,12 @@ def disableConsoleLogging(self, *args, **kwargs): return self._activeCsmLogger.disableConsoleLogging(*args, **kwargs) + def setFormatter(self, formatter=None): + if not self._activeCsmLogger: + raise RuntimeError("(csmlog) setup() must be called first!") + + return self._activeCsmLogger.setFormatter(formatter) + def setup(self, appName, clearLogs=False, udpLogging=True, googleSheetShareEmail=None): ''' must be called to setup the logger. Passes args to CSMLogger's constructor ''' diff --git a/csmlog/tests/test_csmlog.py b/csmlog/tests/test_csmlog.py index df6aa04..78ce053 100644 --- a/csmlog/tests/test_csmlog.py +++ b/csmlog/tests/test_csmlog.py @@ -1,4 +1,5 @@ import io +import logging import os import subprocess import sys @@ -188,3 +189,25 @@ def test_added_attrs_on_logger(csmlog): assert not pathlib.Path(tmp.logFile).is_file() tmp.info("hi") assert pathlib.Path(tmp.logFile).is_file() + + +def test_formatter_setting(csmlog): + logger = csmlog.getLogger('log') + logger.debug("helloworld") + assert 'DEBUG' in pathlib.Path(logger.logFile).read_text() + + csmlog.setFormatter('%(created)f') + logger.debug("helloworld") + assert 'helloworld' not in pathlib.Path(logger.logFile).read_text().splitlines()[-1] + + csmlog.setFormatter(logging.Formatter('%(created)f')) + logger.debug("helloworld") + assert 'helloworld' not in pathlib.Path(logger.logFile).read_text().splitlines()[-1] + + logger2 = csmlog.getLogger('log2') + logger2.debug("helloworld") + assert 'helloworld' not in pathlib.Path(logger2.logFile).read_text().splitlines()[-1] + + csmlog.setFormatter() + logger.debug("helloworld") + assert 'helloworld' in pathlib.Path(logger.logFile).read_text().splitlines()[-1]