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 -
 
--------------------------------------------------------------------------------

Reply via email to