diff --git a/ChangeLog b/ChangeLog index 2163b254..fb20185f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -61,6 +61,8 @@ ver. 0.10.3-dev-1 (20??/??/??) - development edition e. g. date-pattern `^\[{LEPOCH}\]\s+:` will match and cut out `[1516469849551000] :` from begin of the log-line. * badips.py now uses https instead of plain http when requesting badips.com (gh-2057); * add support for "any" badips.py bancategory, to be able to retrieve IPs from all categories with a desired score (gh-2056); +* Introduced new parameter `padding` for logging within fail2ban-server (default on, excepting SYSLOG): + Usage `logtarget = target[padding=on|off]` ver. 0.10.2 (2018/01/18) - nothing-burns-like-the-cold diff --git a/fail2ban/helpers.py b/fail2ban/helpers.py index 6a3ed2fd..7d6b5ce2 100644 --- a/fail2ban/helpers.py +++ b/fail2ban/helpers.py @@ -143,7 +143,7 @@ def str2LogLevel(value): raise ValueError("Invalid log level %r" % value) return ll -def getVerbosityFormat(verbosity, fmt=' %(message)s', addtime=True): +def getVerbosityFormat(verbosity, fmt=' %(message)s', addtime=True, padding=True): """Custom log format for the verbose runs """ if verbosity > 1: # pragma: no cover @@ -155,6 +155,13 @@ def getVerbosityFormat(verbosity, fmt=' %(message)s', addtime=True): fmt = ' %(thread)X %(levelname)-5.5s' + fmt if addtime: fmt = ' %(asctime)-15s' + fmt + else: # default (not verbose): + fmt = "%(name)-23.23s [%(process)d]: %(levelname)-7s" + fmt + if addtime: + fmt = "%(asctime)s " + fmt + # remove padding if not needed: + if not padding: + fmt = re.sub(r'(?<=\))-?\d+(?:\.\d+)?s', lambda m: 's', fmt) return fmt diff --git a/fail2ban/server/server.py b/fail2ban/server/server.py index 039dd879..17cfe016 100644 --- a/fail2ban/server/server.py +++ b/fail2ban/server/server.py @@ -565,10 +565,12 @@ class Server: if systarget == "INHERITED": self.__logTarget = target return True + padding = logOptions.get('padding') # set a format which is simpler for console use - fmt = "%(name)-23.23s [%(process)d]: %(levelname)-7s %(message)s" if systarget == "SYSLOG": facility = logOptions.get('facility', 'DAEMON').upper() + # backwards compatibility - default no padding for syslog handler: + if padding is None: padding = '0' try: facility = getattr(logging.handlers.SysLogHandler, 'LOG_' + facility) except AttributeError: # pragma: no cover @@ -629,15 +631,19 @@ class Server: addtime = addtime in ('1', 'on', 'true', 'yes') else: addtime = systarget not in ("SYSLOG", "SYSOUT") + if padding is not None: + padding = padding in ('1', 'on', 'true', 'yes') + else: + padding = True # If log-format is redefined in options: if logOptions.get('format', '') != '': fmt = logOptions.get('format') - # verbose log-format: - elif self.__verbose is not None and self.__verbose > 2: # pragma: no cover - fmt = getVerbosityFormat(self.__verbose-1, - addtime=addtime) - elif addtime: - fmt = "%(asctime)s " + fmt + else: + # verbose log-format: + verbose = 0 + if self.__verbose is not None and self.__verbose > 2: # pragma: no cover + verbose = self.__verbose-1 + fmt = getVerbosityFormat(verbose, addtime=addtime, padding=padding) # tell the handler to use this format hdlr.setFormatter(logging.Formatter(fmt)) logger.addHandler(hdlr) diff --git a/fail2ban/tests/servertestcase.py b/fail2ban/tests/servertestcase.py index d18b660c..c207311d 100644 --- a/fail2ban/tests/servertestcase.py +++ b/fail2ban/tests/servertestcase.py @@ -832,7 +832,7 @@ class TransmitterLogging(TransmitterBase): os.remove(logTarget) self.setGetTest("logtarget", 'STDOUT[format="%(message)s"]', 'STDOUT') - self.setGetTest("logtarget", 'STDERR[datetime=off]', 'STDERR') + self.setGetTest("logtarget", 'STDERR[datetime=off, padding=off]', 'STDERR') def testLogTargetSYSLOG(self): if not os.path.exists("/dev/log"):