From 46e3b3aff861b5dc2d0dafd77f0f2c457f56a007 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 23 Sep 2020 15:58:19 +0100 Subject: [PATCH] Implement a TRACE level of logging. For things that are too spammy for DEBUG, but we might need them sometimes. --- EDMCLogging.py | 43 ++++++++++++++++++++++++++++++++++++++----- EDMarketConnector.py | 30 ++++++++++++++++++++++++++++-- prefs.py | 4 ++-- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index f882f924..7bf96b2a 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -44,6 +44,17 @@ from config import appcmdname, appname, config _default_loglevel = logging.DEBUG +# Define a TRACE level +LEVEL_TRACE = 5 +logging.addLevelName(LEVEL_TRACE, "TRACE") +logging.TRACE = LEVEL_TRACE # type: ignore +logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type: ignore + logging.TRACE, # type: ignore + message, + args, + **kwargs +) + class Logger: """ @@ -66,9 +77,9 @@ class Logger: """ self.logger = logging.getLogger(logger_name) # Configure the logging.Logger - # This needs to always be DEBUG in order to let DEBUG level messages + # This needs to always be TRACE in order to let TRACE level messages # through to check the *handler* levels. - self.logger.setLevel(logging.DEBUG) + self.logger.setLevel(logging.TRACE) # type: ignore # Set up filter for adding class name self.logger_filter = EDMCContextFilter() @@ -102,8 +113,8 @@ class Logger: encoding='utf-8', delay=False ) - # Yes, we always want these rotated files to be at DEBUG level - self.logger_channel_rotating.setLevel(logging.DEBUG) + # Yes, we always want these rotated files to be at TRACE level + self.logger_channel_rotating.setLevel(logging.TRACE) # type: ignore self.logger_channel_rotating.setFormatter(self.logger_formatter) self.logger.addHandler(self.logger_channel_rotating) @@ -118,10 +129,33 @@ class Logger: def get_streamhandler(self) -> logging.Handler: """ Obtain the self.logger_channel StreamHandler instance. + :return: logging.StreamHandler """ return self.logger_channel + def set_channels_loglevel(self, level: int) -> None: + """ + Set the specified log level on the channels. + + :param level: A valid `logging` level. + :return: None + """ + self.logger_channel.setLevel(level) + self.logger_channel_rotating.setLevel(level) + + def set_console_loglevel(self, level: int) -> None: + """ + Set the specified log level on the console channel. + + :param level: A valid `logging` level. + :return: None + """ + if self.logger_channel.level != logging.TRACE: # type: ignore + self.logger_channel.setLevel(level) + else: + logger.trace("Not changing log level because it's TRACE") # type: ignore + def get_plugin_logger(plugin_name: str, loglevel: int = _default_loglevel) -> logging.Logger: """ @@ -335,7 +369,6 @@ class EDMCContextFilter(logging.Filter): def get_main_logger() -> logging.Logger: """Return the correct logger for how the program is being run.""" - if not os.getenv("EDMC_NO_UI"): # GUI app being run return logging.getLogger(appname) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 5cc7aff5..f5d3b18c 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import argparse from builtins import str from builtins import object import sys @@ -1059,7 +1060,32 @@ Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}''' if __name__ == "__main__": enforce_single_instance() - from EDMCLogging import logger + # Command-line arguments + parser = argparse.ArgumentParser( + prog=appname, + description="Utilises Elite Dangerous Journal files and the Frontier " + "Companion API (CAPI) service to gather data about a " + "player's state and actions to upload to third-party sites " + "such as EDSM, Inara.cz and EDDB." + ) + + parser.add_argument('--trace', + help='Set the Debug logging loglevel to TRACE', + action='store_true', + ) + + args = parser.parse_args() + + from EDMCLogging import edmclogger, logger, logging + # isort: off + from logging import trace, TRACE # type: ignore # noqa: F401 + # isort: on + + if args.trace: + logger.setLevel(logging.TRACE) + edmclogger.set_channels_loglevel(logging.TRACE) + else: + edmclogger.set_channels_loglevel(logging.DEBUG) logger.info(f'Startup v{appversion} : Running on Python v{sys.version}') logger.debug(f'''Platform: {sys.platform} @@ -1114,7 +1140,7 @@ sys.path: {sys.path}''' ui_scale = 100 config.set('ui_scale', ui_scale) theme.default_ui_scale = root.tk.call('tk', 'scaling') - logger.debug(f'Default tk scaling = {theme.default_ui_scale}') + logger.trace(f'Default tk scaling = {theme.default_ui_scale}') theme.startup_ui_scale = ui_scale root.tk.call('tk', 'scaling', theme.default_ui_scale * float(ui_scale) / 100.0) app = AppWindow(root) diff --git a/prefs.py b/prefs.py index 72f90fda..63e68aa6 100644 --- a/prefs.py +++ b/prefs.py @@ -14,7 +14,7 @@ from typing import TYPE_CHECKING, Any, Callable, Optional, Type, Union import myNotebook as nb # noqa: N813 import plug -from config import applongname, appname, appversion, config +from config import applongname, appversion, config from EDMCLogging import edmclogger, get_main_logger from hotkey import hotkeymgr from l10n import Translations @@ -1060,7 +1060,7 @@ class PreferencesDialog(tk.Toplevel): config.set('system_provider', self.system_provider.get()) config.set('station_provider', self.station_provider.get()) config.set('loglevel', self.select_loglevel.get()) - edmclogger.get_streamhandler().setLevel(self.select_loglevel.get()) + edmclogger.set_console_loglevel(self.select_loglevel.get()) lang_codes = {v: k for k, v in self.languages.items()} # Codes by name config.set('language', lang_codes.get(self.lang.get()) or '') # or '' used here due to Default being None above