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]