From ad596002f3dbae6079f2663218596cd670449328 Mon Sep 17 00:00:00 2001 From: Peter Bieringer Date: Sun, 9 Jun 2024 13:42:08 +0200 Subject: [PATCH] add support for conditional logging of backtrace_on_debug --- DOCUMENTATION.md | 6 ++++++ config | 3 +++ radicale/__init__.py | 2 +- radicale/__main__.py | 4 ++-- radicale/config.py | 4 ++++ radicale/log.py | 12 +++++++++--- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index b929b442..382e1e03 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -910,6 +910,12 @@ Log bad PUT request content (for further diagnostics) Default: `False' +##### backtrace_on_debug + +Log backtrace on level=debug + +Default: `True' + #### headers In this section additional HTTP headers that are sent to clients can be diff --git a/config b/config index f195d260..4a2e2f29 100644 --- a/config +++ b/config @@ -123,6 +123,9 @@ # Log bad PUT request content #bad_put_request_content = False +# Log backtrace on level=debug +# backtrace_on_debug = True + [headers] diff --git a/radicale/__init__.py b/radicale/__init__.py index 4df3e989..2ce5d4b7 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -52,7 +52,7 @@ def _get_application_instance(config_path: str, wsgi_errors: types.ErrorStream configuration = config.load(config.parse_compound_paths( config.DEFAULT_CONFIG_PATH, config_path)) - log.set_level(cast(str, configuration.get("logging", "level"))) + log.set_level(cast(str, configuration.get("logging", "level")), configuration.get("logging", "backtrace_on_debug")) # Log configuration after logger is configured default_config_active = True for source, miss in configuration.sources(): diff --git a/radicale/__main__.py b/radicale/__main__.py index e71663b4..f2f157b9 100644 --- a/radicale/__main__.py +++ b/radicale/__main__.py @@ -142,7 +142,7 @@ def run() -> None: # Preliminary configure logging with contextlib.suppress(ValueError): log.set_level(config.DEFAULT_CONFIG_SCHEMA["logging"]["level"]["type"]( - vars(args_ns).get("c:logging:level", ""))) + vars(args_ns).get("c:logging:level", "")), True) # Update Radicale configuration according to arguments arguments_config: types.MUTABLE_CONFIG = {} @@ -165,7 +165,7 @@ def run() -> None: sys.exit(1) # Configure logging - log.set_level(cast(str, configuration.get("logging", "level"))) + log.set_level(cast(str, configuration.get("logging", "level")), configuration.get("logging", "backtrace_on_debug")) # Log configuration after logger is configured default_config_active = True diff --git a/radicale/config.py b/radicale/config.py index 6961c460..27352bdc 100644 --- a/radicale/config.py +++ b/radicale/config.py @@ -252,6 +252,10 @@ DEFAULT_CONFIG_SCHEMA: types.CONFIG_SCHEMA = OrderedDict([ "value": "False", "help": "log bad PUT request content", "type": bool}), + ("backtrace_on_debug", { + "value": "True", + "help": "log backtrace on level=debug", + "type": bool}), ("mask_passwords", { "value": "True", "help": "mask passwords in logs", diff --git a/radicale/log.py b/radicale/log.py index 8d54a1b0..5047ca66 100644 --- a/radicale/log.py +++ b/radicale/log.py @@ -215,17 +215,23 @@ def setup() -> None: register_stream = handler.register_stream log_record_factory = IdentLogRecordFactory(logging.getLogRecordFactory()) logging.setLogRecordFactory(log_record_factory) - set_level(logging.WARNING) + set_level(logging.WARNING, True) if format_name != sane_format_name: logger.error("Invalid RADICALE_LOG_FORMAT: %r", format_name) -def set_level(level: Union[int, str]) -> None: +def set_level(level: Union[int, str], backtrace_on_debug: bool) -> None: """Set logging level for global logger.""" if isinstance(level, str): level = getattr(logging, level.upper()) assert isinstance(level, int) logger.setLevel(level) - logger.removeFilter(REMOVE_TRACEBACK_FILTER) if level > logging.DEBUG: + logger.info("Logging of backtrace is disabled in this loglevel") logger.addFilter(REMOVE_TRACEBACK_FILTER) + else: + if not backtrace_on_debug: + logger.debug("Logging of backtrace is disabled by option in this loglevel") + logger.addFilter(REMOVE_TRACEBACK_FILTER) + else: + logger.removeFilter(REMOVE_TRACEBACK_FILTER)