🎨 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 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")

View File

@@ -16,9 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# 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)