Source code for thinftp.logger


"""
Custom logger setup for the thinFTP server.

This module defines a custom logging level called "SUCCESS", provides
colored log formatting for different levels, and supplies a helper
function `get_logger` to configure a logger instance for use
throughout the application.
"""

import logging as l

SUCCESS = 25
l.addLevelName(SUCCESS, 'SUCCESS')

[docs] def success(self, message, *args, **kwargs): """ Log a message with the custom SUCCESS level. Parameters: message (str): The message to be logged. *args: Variable length argument list. **kwargs: Arbitrary keyword arguments. """ if self.isEnabledFor(SUCCESS): self._log(SUCCESS, message, args, **kwargs)
# Add the custom success method to the Logger class l.Logger.success = success
[docs] class Formatter(l.Formatter): """ Custom log formatter with ANSI color codes for console output. Formats log messages with different colors depending on the level, improving readability during development or monitoring. """ red = '\033[31m' bold_red = '\033[1;31m' yellow = '\033[93m' green = '\033[32m' gray = '\033[38;20m' bold = '\033[1m' reset = '\033[0m' format = '[%(asctime)s] [%(levelname)-8s] %(message)s' # Mapping log levels to colorized formats FORMATS = { l.DEBUG: gray + format + reset, l.INFO: bold + format + reset, SUCCESS: green + format + reset, l.WARNING: yellow + format + reset, l.ERROR: red + format + reset, l.CRITICAL: bold_red + format + reset }
[docs] def format(self, record): """ Apply the appropriate color format to the log record. Parameters: record (LogRecord): The log record to format. Returns: str: The formatted log message string. """ log_fmt = self.FORMATS.get(record.levelno) formatter = l.Formatter(log_fmt) return formatter.format(record)
[docs] def get_logger(name="thinFTP", debug=False): """ Create and configure a logger with color output and custom SUCCESS level. Parameters: name (str): Name of the logger. Defaults to "thinFTP". debug (bool): If True, sets the log level to DEBUG; otherwise INFO. Returns: logging.Logger: Configured logger instance. """ logger = l.getLogger(name) logger.setLevel(l.DEBUG if debug else l.INFO) # Prevent duplicate handlers if not logger.hasHandlers(): handler = l.StreamHandler() handler.setFormatter(Formatter()) logger.addHandler(handler) logger.propagate = False return logger