🎨 Improved logging code

- 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.
This commit is contained in:
GeoffreyCoulaud
2023-06-12 03:27:43 +02:00
parent 6a099b2bdd
commit 2798097623
2 changed files with 42 additions and 27 deletions

View File

@@ -1,6 +1,6 @@
import logging
import logging.config as logging_dot_config import logging.config as logging_dot_config
import os import os
from datetime import datetime
from src import shared from src import shared
@@ -8,51 +8,71 @@ from src import shared
def setup_logging(): def setup_logging():
"""Intitate the app's logging""" """Intitate the app's logging"""
# Prepare log file # Prepare the log file
log_dir = shared.data_dir / "cartridges" / "logs" log_dir = shared.data_dir / "cartridges" / "logs"
log_dir.mkdir(exist_ok=True) 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 # 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" 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() lib_log_level = os.environ.get("LIBLOGLEVEL", profile_lib_log_level).upper()
# Load config
config = { config = {
"version": 1, "version": 1,
"formatters": { "formatters": {
"console_formatter": {
"class": "src.logging.color_log_formatter.ColorLogFormatter",
"format": "%(name)s %(levelname)s - %(message)s",
},
"file_formatter": { "file_formatter": {
"format": "%(asctime)s | %(name)s | %(levelname)s | %(message)s" "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": { "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", "class": "logging.StreamHandler",
"formatter": "console_formatter", "formatter": "console_formatter",
"level": main_log_level, "level": app_log_level,
}, },
"lib_console_handler": { "lib_console_handler": {
"class": "logging.StreamHandler", "class": "logging.StreamHandler",
"formatter": "console_formatter", "formatter": "console_formatter",
"level": lib_log_level, "level": lib_log_level,
}, },
"file_handler": {
"class": "logging.FileHandler",
"level": "DEBUG",
"filename": str(log_file),
"formatter": "file_formatter",
},
}, },
"loggers": { "loggers": {
"PIL": {"handlers": ["lib_console_handler", "file_handler"]}, "PIL": {
"urllib3": {"handlers": ["lib_console_handler", "file_handler"]}, "handlers": ["lib_console_handler", "file_handler"],
"root": {"handlers": ["main_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) 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")

View File

@@ -16,9 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import json import json
import logging
import sys import sys
import gi import gi
@@ -255,10 +253,7 @@ class CartridgesApplication(Adw.Application):
scope.add_action(simple_action) scope.add_action(simple_action)
def main(version): # pylint: disable=unused-argument def main(_version):
# Initiate logger
logging.basicConfig(level="DEBUG")
setup_logging() setup_logging()
# Start app
app = CartridgesApplication() app = CartridgesApplication()
return app.run(sys.argv) return app.run(sys.argv)