This is an automated email from the ASF dual-hosted git repository.
jason810496 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new b69b189d994 Fix triggerer log server port configuration key (#67785)
b69b189d994 is described below
commit b69b189d9947eac6ab0e378686c6f66e0e5fb08e
Author: vin-c-ent <[email protected]>
AuthorDate: Tue Jun 23 11:26:52 2026 +0800
Fix triggerer log server port configuration key (#67785)
---
.../logging-monitoring/logging-tasks.rst | 2 +-
.../src/airflow/utils/log/file_task_handler.py | 13 ++-
airflow-core/tests/unit/utils/test_log_handlers.py | 100 +++++++++++++++++++++
3 files changed, 113 insertions(+), 2 deletions(-)
diff --git
a/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst
b/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst
index 2403a487f96..3f2a70e49c9 100644
---
a/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst
+++
b/airflow-core/docs/administration-and-deployment/logging-monitoring/logging-tasks.rst
@@ -180,7 +180,7 @@ Most task handlers send logs upon completion of a task. In
order to view logs in
In triggerer, logs are served unless the service is started with option
``--skip-serve-logs``.
-The server is running on the port specified by ``worker_log_server_port``
option in ``[logging]`` section, and option ``triggerer_log_server_port`` for
triggerer. Defaults are 8793 and 8794, respectively.
+The server is running on the port specified by ``worker_log_server_port``
option in ``[logging]`` section, and option ``trigger_log_server_port`` for
triggerer. Defaults are 8793 and 8794, respectively.
Communication between the webserver and the worker is signed with the key
specified by ``secret_key`` option in ``[api]`` section. You must ensure that
the key matches so that communication can take place without problems.
We are using `Gunicorn <https://gunicorn.org/>`__ as a WSGI server. Its
configuration options can be overridden with the ``GUNICORN_CMD_ARGS`` env
variable. For details, see `Gunicorn settings
<https://docs.gunicorn.org/en/latest/settings.html#settings>`__.
diff --git a/airflow-core/src/airflow/utils/log/file_task_handler.py
b/airflow-core/src/airflow/utils/log/file_task_handler.py
index 8a94b513b41..9eec24b1813 100644
--- a/airflow-core/src/airflow/utils/log/file_task_handler.py
+++ b/airflow-core/src/airflow/utils/log/file_task_handler.py
@@ -714,7 +714,18 @@ class FileTaskHandler(logging.Handler):
if log_type == LogType.TRIGGER:
if not ti.triggerer_job:
raise RuntimeError("Could not build triggerer log URL; no
triggerer job.")
- config_key = "triggerer_log_server_port"
+ config_key = "trigger_log_server_port"
+ deprecated_config_key = "triggerer_log_server_port"
+ if (
+ conf.get("logging", config_key, fallback=None) is None
+ and conf.get("logging", deprecated_config_key, fallback=None)
is not None
+ ):
+ logger.warning(
+ "The [logging] %s option is deprecated. Please use
[logging] %s instead.",
+ deprecated_config_key,
+ config_key,
+ )
+ config_key = deprecated_config_key
config_default = 8794
hostname = ti.triggerer_job.hostname
log_relative_path = self.add_triggerer_suffix(log_relative_path,
job_id=ti.triggerer_job.id)
diff --git a/airflow-core/tests/unit/utils/test_log_handlers.py
b/airflow-core/tests/unit/utils/test_log_handlers.py
index 1c52f84a5f6..24a2e367a38 100644
--- a/airflow-core/tests/unit/utils/test_log_handlers.py
+++ b/airflow-core/tests/unit/utils/test_log_handlers.py
@@ -857,6 +857,106 @@ class TestLogUrl:
"DYNAMIC_PATH.trigger.123.log",
)
+ def test_log_retrieval_trigger_uses_trigger_log_server_port(self,
create_task_instance):
+ with conf_vars({("logging", "trigger_log_server_port"): "9001"}):
+ ti = create_task_instance(
+ dag_id="dag_for_testing_filename_rendering",
+ task_id="task_for_testing_filename_rendering",
+ run_type=DagRunType.SCHEDULED,
+ logical_date=DEFAULT_DATE,
+ )
+ ti.hostname = "hostname"
+ trigger = Trigger("", {})
+ job = Job(TriggererJobRunner.job_type)
+ job.id = 123
+ trigger.triggerer_job = job
+ ti.trigger = trigger
+ actual = FileTaskHandler("")._get_log_retrieval_url(ti,
"DYNAMIC_PATH", log_type=LogType.TRIGGER)
+ hostname = get_hostname()
+ assert actual == (
+ f"http://{hostname}:9001/log/DYNAMIC_PATH.trigger.123.log",
+ "DYNAMIC_PATH.trigger.123.log",
+ )
+
+ def test_log_retrieval_trigger_falls_back_to_deprecated_config(self,
create_task_instance):
+ with conf_vars(
+ {
+ ("logging", "trigger_log_server_port"): None,
+ ("logging", "triggerer_log_server_port"): "9002",
+ }
+ ):
+ ti = create_task_instance(
+ dag_id="dag_for_testing_filename_rendering",
+ task_id="task_for_testing_filename_rendering",
+ run_type=DagRunType.SCHEDULED,
+ logical_date=DEFAULT_DATE,
+ )
+ ti.hostname = "hostname"
+ trigger = Trigger("", {})
+ job = Job(TriggererJobRunner.job_type)
+ job.id = 123
+ trigger.triggerer_job = job
+ ti.trigger = trigger
+ actual = FileTaskHandler("")._get_log_retrieval_url(ti,
"DYNAMIC_PATH", log_type=LogType.TRIGGER)
+ hostname = get_hostname()
+ assert actual == (
+ f"http://{hostname}:9002/log/DYNAMIC_PATH.trigger.123.log",
+ "DYNAMIC_PATH.trigger.123.log",
+ )
+
+ def test_log_retrieval_trigger_prefers_new_config_over_deprecated(self,
create_task_instance):
+ with conf_vars(
+ {
+ ("logging", "trigger_log_server_port"): "9001",
+ ("logging", "triggerer_log_server_port"): "9002",
+ }
+ ):
+ ti = create_task_instance(
+ dag_id="dag_for_testing_filename_rendering",
+ task_id="task_for_testing_filename_rendering",
+ run_type=DagRunType.SCHEDULED,
+ logical_date=DEFAULT_DATE,
+ )
+ ti.hostname = "hostname"
+ trigger = Trigger("", {})
+ job = Job(TriggererJobRunner.job_type)
+ job.id = 123
+ trigger.triggerer_job = job
+ ti.trigger = trigger
+ actual = FileTaskHandler("")._get_log_retrieval_url(ti,
"DYNAMIC_PATH", log_type=LogType.TRIGGER)
+ hostname = get_hostname()
+ assert actual == (
+ f"http://{hostname}:9001/log/DYNAMIC_PATH.trigger.123.log",
+ "DYNAMIC_PATH.trigger.123.log",
+ )
+
+ def test_log_retrieval_trigger_warns_on_deprecated_config(self,
create_task_instance):
+ with conf_vars(
+ {
+ ("logging", "trigger_log_server_port"): None,
+ ("logging", "triggerer_log_server_port"): "9002",
+ }
+ ):
+ ti = create_task_instance(
+ dag_id="dag_for_testing_filename_rendering",
+ task_id="task_for_testing_filename_rendering",
+ run_type=DagRunType.SCHEDULED,
+ logical_date=DEFAULT_DATE,
+ )
+ ti.hostname = "hostname"
+ trigger = Trigger("", {})
+ job = Job(TriggererJobRunner.job_type)
+ job.id = 123
+ trigger.triggerer_job = job
+ ti.trigger = trigger
+ with
mock.patch("airflow.utils.log.file_task_handler.logger.warning") as
mock_logger_warning:
+ FileTaskHandler("")._get_log_retrieval_url(ti, "DYNAMIC_PATH",
log_type=LogType.TRIGGER)
+ mock_logger_warning.assert_called_once_with(
+ "The [logging] %s option is deprecated. Please use
[logging] %s instead.",
+ "triggerer_log_server_port",
+ "trigger_log_server_port",
+ )
+
log_sample = """[2022-11-16T00:05:54.278-0800] {taskinstance.py:1257} INFO -
--------------------------------------------------------------------------------