Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions airflow-core/src/airflow/config_templates/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 8 additions & 3 deletions airflow-core/src/airflow/utils/serve_logs/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -41,11 +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=host)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


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}"
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)

Expand All @@ -54,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

Expand Down