From 958ce07a4998e592ff2164407a9c2aab540aa3c1 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 5 Jan 2026 06:27:27 -0500 Subject: [PATCH 1/3] Added WORKER_LOG_SERVER_HOST option --- airflow-core/src/airflow/utils/serve_logs/core.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airflow-core/src/airflow/utils/serve_logs/core.py b/airflow-core/src/airflow/utils/serve_logs/core.py index c09a9f603f30c..04effeaa48d4f 100644 --- a/airflow-core/src/airflow/utils/serve_logs/core.py +++ b/airflow-core/src/airflow/utils/serve_logs/core.py @@ -41,8 +41,11 @@ def serve_logs(port=None): setproctitle("airflow serve-logs") port = port or conf.getint("logging", "WORKER_LOG_SERVER_PORT") + host = conf.get('logging', 'WORKER_LOG_SERVER_HOST', fallback=None) - if socket.has_dualstack_ipv6(): + if host: + serve_log_uri = f"http://{host}:{port}" + elif socket.has_dualstack_ipv6(): serve_log_uri = f"http://[::]:{port}" else: serve_log_uri = f"http://0.0.0.0:{port}" From a3fdd8057d9f7a4ce61cbac96469c6e09886e007 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 5 Jan 2026 06:56:10 -0500 Subject: [PATCH 2/3] Fixed uvicorn parameter --- airflow-core/src/airflow/utils/serve_logs/core.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/airflow-core/src/airflow/utils/serve_logs/core.py b/airflow-core/src/airflow/utils/serve_logs/core.py index 04effeaa48d4f..93ff5785cd939 100644 --- a/airflow-core/src/airflow/utils/serve_logs/core.py +++ b/airflow-core/src/airflow/utils/serve_logs/core.py @@ -29,7 +29,7 @@ logger = structlog.get_logger(__name__) -def serve_logs(port=None): +def serve_logs(host=None, port=None): """Serve logs generated by Worker.""" # setproctitle causes issue on Mac OS: https://github.com/benoitc/gunicorn/issues/3021 os_type = sys.platform @@ -41,14 +41,16 @@ def serve_logs(port=None): setproctitle("airflow serve-logs") port = port or conf.getint("logging", "WORKER_LOG_SERVER_PORT") - host = conf.get('logging', 'WORKER_LOG_SERVER_HOST', fallback=None) + host = conf.get("logging", "WORKER_LOG_SERVER_HOST", fallback=host) if host: serve_log_uri = f"http://{host}:{port}" elif socket.has_dualstack_ipv6(): serve_log_uri = f"http://[::]:{port}" + host = '::' else: serve_log_uri = f"http://0.0.0.0:{port}" + host = '0.0.0.0' logger.info("Starting log server on %s", serve_log_uri) @@ -57,7 +59,7 @@ def serve_logs(port=None): # Use uvicorn directly for ASGI applications uvicorn.run( - "airflow.utils.serve_logs.log_server:get_app", host="", port=port, log_level=uvicorn_log_level + "airflow.utils.serve_logs.log_server:get_app", host=host, port=port, log_level=uvicorn_log_level ) # Log serving is I/O bound and has low concurrency, so single process is sufficient From 30385fdfab87e4aa26bc285bed3097138f50e2c1 Mon Sep 17 00:00:00 2001 From: Anthony Date: Mon, 5 Jan 2026 13:56:33 -0500 Subject: [PATCH 3/3] Allow explicit host bind for worker log server --- airflow-core/src/airflow/config_templates/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/airflow-core/src/airflow/config_templates/config.yml b/airflow-core/src/airflow/config_templates/config.yml index a4ed088865a61..121b8de93d278 100644 --- a/airflow-core/src/airflow/config_templates/config.yml +++ b/airflow-core/src/airflow/config_templates/config.yml @@ -977,6 +977,14 @@ logging: type: string example: "fastapi,sqlalchemy" default: "" + worker_log_server_host: + description: | + The interface address on which the worker should start the log server. + If not set, it will default to 0.0.0.0 (or [::] for IPv6). + version_added: ~ + type: string + example: "127.0.0.1" + default: ~ worker_log_server_port: description: | When you start an Airflow worker, Airflow starts a tiny web server