diff --git a/src/logging/color_log_formatter.py b/src/logging/color_log_formatter.py new file mode 100644 index 0000000..54a873b --- /dev/null +++ b/src/logging/color_log_formatter.py @@ -0,0 +1,25 @@ +from logging import Formatter, LogRecord + + +class ColorLogFormatter(Formatter): + """Formatter that outputs logs in a colored format""" + + RESET = "\033[0m" + DIM = "\033[2m" + BOLD = "\033[1m" + RED = "\033[31m" + YELLOW = "\033[33m" + + def format(self, record: LogRecord): + super_format = super().format(record) + match record.levelname: + case "CRITICAL": + return self.BOLD + self.RED + super_format + self.RESET + case "ERROR": + return self.RED + super_format + self.RESET + case "WARNING": + return self.YELLOW + super_format + self.RESET + case "DEBUG": + return self.DIM + super_format + self.RESET + case _other: + return super_format diff --git a/src/logging/setup.py b/src/logging/setup.py new file mode 100644 index 0000000..83dbc9b --- /dev/null +++ b/src/logging/setup.py @@ -0,0 +1,58 @@ +import logging.config as logging_dot_config +import os +from datetime import datetime + +from src import shared + + +def setup_logging(): + """Intitate the app's logging""" + + # Prepare log file + log_dir = shared.data_dir / "cartridges" / "logs" + log_dir.mkdir(exist_ok=True) + log_file = log_dir / f'{datetime.now().isoformat(timespec="seconds")}.log' + + # Define log levels + profile_main_log_level = "DEBUG" if shared.PROFILE == "development" else "WARNING" + profile_lib_log_level = "INFO" if shared.PROFILE == "development" else "WARNING" + main_log_level = os.environ.get("LOGLEVEL", profile_main_log_level).upper() + lib_log_level = os.environ.get("LIBLOGLEVEL", profile_lib_log_level).upper() + + # Load config + config = { + "version": 1, + "formatters": { + "console_formatter": { + "class": "src.logging.color_log_formatter.ColorLogFormatter", + "format": "%(name)s %(levelname)s - %(message)s", + }, + "file_formatter": { + "format": "%(asctime)s | %(name)s | %(levelname)s | %(message)s" + }, + }, + "handlers": { + "main_console_handler": { + "class": "logging.StreamHandler", + "formatter": "console_formatter", + "level": main_log_level, + }, + "lib_console_handler": { + "class": "logging.StreamHandler", + "formatter": "console_formatter", + "level": lib_log_level, + }, + "file_handler": { + "class": "logging.FileHandler", + "level": "DEBUG", + "filename": str(log_file), + "formatter": "file_formatter", + }, + }, + "loggers": { + "PIL": {"handlers": ["lib_console_handler", "file_handler"]}, + "urllib3": {"handlers": ["lib_console_handler", "file_handler"]}, + "root": {"handlers": ["main_console_handler", "file_handler"]}, + }, + } + logging_dot_config.dictConfig(config) diff --git a/src/main.py b/src/main.py index 6fdea73..f4f413f 100644 --- a/src/main.py +++ b/src/main.py @@ -19,7 +19,6 @@ import json import logging -import os import sys import gi @@ -40,6 +39,7 @@ from src.importer.sources.itch_source import ItchSource from src.importer.sources.legendary_source import LegendarySource from src.importer.sources.lutris_source import LutrisSource from src.importer.sources.steam_source import SteamSource +from src.logging.setup import setup_logging from src.preferences import PreferencesWindow from src.store.managers.display_manager import DisplayManager from src.store.managers.file_manager import FileManager @@ -257,20 +257,8 @@ class CartridgesApplication(Adw.Application): def main(version): # pylint: disable=unused-argument # Initiate logger - # (silence debug info from external libraries) - profile_base_log_level = "DEBUG" if shared.PROFILE == "development" else "WARNING" - profile_lib_log_level = "INFO" if shared.PROFILE == "development" else "WARNING" - base_log_level = os.environ.get("LOGLEVEL", profile_base_log_level).upper() - lib_log_level = os.environ.get("LIBLOGLEVEL", profile_lib_log_level).upper() - log_levels = { - None: base_log_level, - "PIL": lib_log_level, - "urllib3": lib_log_level, - } - logging.basicConfig() - for logger, level in log_levels.items(): - logging.getLogger(logger).setLevel(level) - + logging.basicConfig(level="DEBUG") + setup_logging() # Start app app = CartridgesApplication() return app.run(sys.argv) diff --git a/src/meson.build b/src/meson.build index c5ef74f..6631a62 100644 --- a/src/meson.build +++ b/src/meson.build @@ -12,6 +12,7 @@ install_subdir('importer', install_dir: moduledir) install_subdir('importers', install_dir: moduledir) install_subdir('utils', install_dir: moduledir) install_subdir('store', install_dir: moduledir) +install_subdir('logging', install_dir: moduledir) install_data( [ 'main.py',