This is an automated email from the ASF dual-hosted git repository.

arm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/main by this push:
     new c778fd5  Move request logging for #549 into file. Reduce 
docker-compose healthchecks after startup. Log level configurable.
c778fd5 is described below

commit c778fd5fdef5ebcfdc6f50df685835694238d577
Author: Alastair McFarlane <[email protected]>
AuthorDate: Fri Jan 23 16:48:24 2026 +0000

    Move request logging for #549 into file. Reduce docker-compose healthchecks 
after startup. Log level configurable.
---
 atr/config.py      |  2 ++
 atr/server.py      | 38 +++++++++++++++++++++++++++++++++-----
 docker-compose.yml |  3 ++-
 3 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/atr/config.py b/atr/config.py
index b8090c5..e1ff073 100644
--- a/atr/config.py
+++ b/atr/config.py
@@ -77,6 +77,7 @@ class AppConfig:
     STATE_DIR = decouple.config("STATE_DIR", 
default=os.path.join(PROJECT_ROOT, "state"))
     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_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)
@@ -104,6 +105,7 @@ class AppConfig:
     SQLITE_DB_PATH = decouple.config("SQLITE_DB_PATH", 
default="database/atr.db")
     STORAGE_AUDIT_LOG_FILE = os.path.join(STATE_DIR, "audit", 
"storage-audit.log")
     PERFORMANCE_LOG_FILE = os.path.join(STATE_DIR, "logs", 
"route-performance.log")
+    REQUEST_LOG_FILE = os.path.join(STATE_DIR, "logs", "requests.log")
 
     # Apache RAT configuration
     APACHE_RAT_JAR_PATH = decouple.config("APACHE_RAT_JAR_PATH", 
default=f"/opt/tools/apache-rat-{_RAT_VERSION}.jar")
diff --git a/atr/server.py b/atr/server.py
index 0408f29..948cb19 100644
--- a/atr/server.py
+++ b/atr/server.py
@@ -294,10 +294,7 @@ def _app_setup_lifecycle(app: base.QuartApp, app_config: 
type[config.AppConfig])
 
         await db.shutdown_database()
 
-        if audit_listener := app.extensions.get("audit_listener"):
-            audit_listener.stop()
-        if listener := app.extensions.get("logging_listener"):
-            listener.stop()
+        await _app_shutdown_log_listeners(app)
 
         app.background_tasks.clear()
 
@@ -345,7 +342,7 @@ def _app_setup_logging(app: base.QuartApp, config_mode: 
config.Mode, app_config:
     listener.start()
 
     logging.basicConfig(
-        level=logging.INFO,
+        level=logging.getLevelNamesMapping()[app_config.LOG_LEVEL],
         handlers=[log.StructlogQueueHandler(log_queue)],
         force=True,
     )
@@ -383,6 +380,28 @@ def _app_setup_logging(app: base.QuartApp, config_mode: 
config.Mode, app_config:
     audit_logger.addHandler(logging.handlers.QueueHandler(audit_queue))
     audit_logger.propagate = False
 
+    # Request logs
+    request_handler = logging.FileHandler(app_config.REQUEST_LOG_FILE, 
encoding="utf-8")
+    request_handler.setFormatter(
+        structlog.stdlib.ProcessorFormatter(
+            processors=[
+                structlog.stdlib.ProcessorFormatter.remove_processors_meta,
+                structlog.processors.JSONRenderer(),
+            ],
+            foreign_pre_chain=shared_processors,
+        )
+    )
+    request_queue: queue.Queue[logging.LogRecord] = queue.Queue(-1)
+    request_listener = logging.handlers.QueueListener(request_queue, 
request_handler)
+    request_listener.start()
+    app.extensions["request_listener"] = request_listener
+
+    request_logger = logging.getLogger("atr.request")
+    request_logger.setLevel(logging.INFO)
+    request_logger.handlers.clear()
+    request_logger.addHandler(log.StructlogQueueHandler(request_queue))
+    request_logger.propagate = False
+
     # Enable debug output for atr.* in DEBUG mode
     if config_mode == config.Mode.Debug:
         logging.getLogger(atr.__name__).setLevel(logging.DEBUG)
@@ -497,6 +516,15 @@ def _app_setup_security_headers(app: base.QuartApp) -> 
None:
         return response
 
 
+async def _app_shutdown_log_listeners(app):
+    if audit_listener := app.extensions.get("audit_listener"):
+        audit_listener.stop()
+    if request_listener := app.extensions.get("request_listener"):
+        request_listener.stop()
+    if listener := app.extensions.get("logging_listener"):
+        listener.stop()
+
+
 def _create_app(app_config: type[config.AppConfig]) -> base.QuartApp:
     """Create and configure the application."""
     if os.sep != "/":
diff --git a/docker-compose.yml b/docker-compose.yml
index 609501e..2979250 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -20,10 +20,11 @@ services:
       - 8080:8080
     healthcheck:
       test: ["CMD", "curl", "-k", "-f", "https://127.0.0.1:8080/";]
-      interval: 2s
+      interval: 30s
       timeout: 1s
       retries: 30
       start_period: 10s
+      start_interval: 2s
 
 networks:
   atr-network:


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to