From 2798097623ff848742912b501091b3469b693e3c Mon Sep 17 00:00:00 2001 From: GeoffreyCoulaud Date: Mon, 12 Jun 2023 03:27:43 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Improved=20logging=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Silenced unwanted library messages - Logging to file with a max size of 8MB When the file size is passed, a backup of the file is created, and the file gets truncated. There can only be one current file and one backup file. --- src/logging/setup.py | 62 +++++++++++++++++++++++++++++--------------- src/main.py | 7 +---- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/logging/setup.py b/src/logging/setup.py index 83dbc9b..c8184ff 100644 --- a/src/logging/setup.py +++ b/src/logging/setup.py @@ -1,6 +1,6 @@ +import logging import logging.config as logging_dot_config import os -from datetime import datetime from src import shared @@ -8,51 +8,71 @@ from src import shared def setup_logging(): """Intitate the app's logging""" - # Prepare log file + # Prepare the 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' + log_file_path = log_dir / "cartridges.log" + log_file_max_size_bytes = 8 * 10**6 # 8 MB # Define log levels - profile_main_log_level = "DEBUG" if shared.PROFILE == "development" else "WARNING" + profile_app_log_level = "DEBUG" if shared.PROFILE == "development" else "INFO" profile_lib_log_level = "INFO" if shared.PROFILE == "development" else "WARNING" - main_log_level = os.environ.get("LOGLEVEL", profile_main_log_level).upper() + app_log_level = os.environ.get("LOGLEVEL", profile_app_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" }, + "console_formatter": { + "format": "%(name)s %(levelname)s - %(message)s", + "class": "src.logging.color_log_formatter.ColorLogFormatter", + }, }, "handlers": { - "main_console_handler": { + "file_handler": { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "file_formatter", + "level": "DEBUG", + "filename": log_file_path, + "maxBytes": log_file_max_size_bytes, + "backupCount": 1, + }, + "app_console_handler": { "class": "logging.StreamHandler", "formatter": "console_formatter", - "level": main_log_level, + "level": app_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"]}, + "PIL": { + "handlers": ["lib_console_handler", "file_handler"], + "propagate": False, + "level": "NOTSET", + }, + "urllib3": { + "handlers": ["lib_console_handler", "file_handler"], + "propagate": False, + "level": "NOTSET", + }, + }, + "root": { + "level": "NOTSET", + "handlers": ["app_console_handler", "file_handler"], }, } logging_dot_config.dictConfig(config) + + # Inform of the logging behaviour + logging.info("Logging profile: %s", shared.PROFILE) + logging.info("Console logging level for application: %s", app_log_level) + logging.info("Console logging level for libraries: %s", lib_log_level) + logging.info("Use env vars LOGLEVEL, LIBLOGLEVEL to override") + logging.info("All message levels are written to the log file") diff --git a/src/main.py b/src/main.py index f4f413f..8ac30dd 100644 --- a/src/main.py +++ b/src/main.py @@ -16,9 +16,7 @@ # along with this program. If not, see . # # SPDX-License-Identifier: GPL-3.0-or-later - import json -import logging import sys import gi @@ -255,10 +253,7 @@ class CartridgesApplication(Adw.Application): scope.add_action(simple_action) -def main(version): # pylint: disable=unused-argument - # Initiate logger - logging.basicConfig(level="DEBUG") +def main(_version): setup_logging() - # Start app app = CartridgesApplication() return app.run(sys.argv)