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]

Reply via email to