This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch sbp
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git
The following commit(s) were added to refs/heads/sbp by this push:
new 521e6e1 Allow JSON logs to be configured and fix traceback logging
521e6e1 is described below
commit 521e6e11e3035e3150f6aae60ca7e6e6a7d389f1
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Feb 2 17:15:34 2026 +0000
Allow JSON logs to be configured and fix traceback logging
---
atr/config.py | 1 +
atr/server.py | 15 +++++++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/atr/config.py b/atr/config.py
index 42a834a..4535fd1 100644
--- a/atr/config.py
+++ b/atr/config.py
@@ -79,6 +79,7 @@ class AppConfig:
LDAP_BIND_DN = _config_secrets("LDAP_BIND_DN", STATE_DIR, default=None,
cast=str)
LDAP_BIND_PASSWORD = _config_secrets("LDAP_BIND_PASSWORD", STATE_DIR,
default=None, cast=str)
LOG_LEVEL = decouple.config("LOG_LEVEL", default="INFO", cast=lambda x:
x.upper())
+ LOG_JSON = decouple.config("LOG_JSON", default=False, cast=bool)
LOG_PUBLIC_KEY = _config_secrets("LOG_PUBLIC_KEY", STATE_DIR,
default=None, cast=str)
PUBSUB_URL = _config_secrets("PUBSUB_URL", STATE_DIR, default=None,
cast=str)
PUBSUB_USER = _config_secrets("PUBSUB_USER", STATE_DIR, default=None,
cast=str)
diff --git a/atr/server.py b/atr/server.py
index 70438d1..4ad9c66 100644
--- a/atr/server.py
+++ b/atr/server.py
@@ -326,12 +326,14 @@ def _app_setup_logging(app: base.QuartApp, config_mode:
config.Mode, app_config:
# Output handler: pretty console for dev (Debug and Allow Tests), JSON for
non-dev (Docker, etc.)
output_handler = logging.StreamHandler(sys.stderr)
- if util.is_dev_environment():
- renderer: structlog.types.Processor =
structlog.dev.ConsoleRenderer(colors=True)
+ use_json_output = app_config.LOG_JSON or (not util.is_dev_environment())
+ if use_json_output:
+ # JSON output should include rendered exceptions
+
output_handler.setFormatter(loggers.create_json_formatter(shared_processors))
else:
- renderer = structlog.processors.JSONRenderer()
- # Queue-based logging for thread safety
-
output_handler.setFormatter(loggers.create_output_formatter(shared_processors,
renderer))
+ renderer: structlog.types.Processor =
structlog.dev.ConsoleRenderer(colors=True)
+ # Queue-based logging for thread safety
+
output_handler.setFormatter(loggers.create_output_formatter(shared_processors,
renderer))
log_queue: queue.Queue[logging.LogRecord] = queue.Queue(-1)
handlers: list[logging.Handler] = [output_handler]
@@ -820,7 +822,8 @@ def _register_routes(app: base.QuartApp) -> None: # noqa:
C901
status_code = getattr(error, "code", 500) if isinstance(error,
Exception) else 500
return quart.jsonify({"error": str(error)}), status_code
- log.exception("Unhandled exception")
+ exc_info = (type(error), error, error.__traceback__)
+ log.error("Unhandled exception", exc_info=exc_info)
if util.is_dev_environment():
return await template.render(
"error.html",
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]