diff --git a/apps/axon_agent/src/process_manager.cpp b/apps/axon_agent/src/process_manager.cpp index ae0d7671..a8e3bbc1 100644 --- a/apps/axon_agent/src/process_manager.cpp +++ b/apps/axon_agent/src/process_manager.cpp @@ -88,6 +88,10 @@ bool parse_http_url(const std::string& url, HttpUrl* output, std::string* error) return true; } +std::filesystem::path default_transient_log_dir() { + return std::filesystem::path("/tmp") / "axon-agent" / "logs"; +} + } // namespace ProcessManager::ProcessManager(std::filesystem::path state_dir) @@ -794,7 +798,7 @@ std::filesystem::path ProcessManager::default_log_file( ) const { const auto pid_file = config.pid_file.empty() ? default_pid_file(config.process_id) : config.pid_file; - return state_dir_ / "logs" / (pid_file.stem().string() + "." + stream + ".log"); + return default_transient_log_dir() / (pid_file.stem().string() + "." + stream + ".log"); } } // namespace agent diff --git a/apps/axon_agent/test/test_agent_service.cpp b/apps/axon_agent/test/test_agent_service.cpp index ab79f1a7..146d5fe2 100644 --- a/apps/axon_agent/test/test_agent_service.cpp +++ b/apps/axon_agent/test/test_agent_service.cpp @@ -140,6 +140,18 @@ auto_start: false recorder["health_check"]["timeout_ms"].get() == 250, "recorder health timeout mismatch" ); + const auto& transfer = processes["transfer"]; + require( + transfer["stdout_log"].get() == + (std::filesystem::path("/tmp/axon-agent/logs") / "demo_robot_transfer.stdout.log").string(), + "transfer default stdout_log mismatch" + ); + require( + transfer["stderr_log"].get() == + (std::filesystem::path("/tmp/axon-agent/logs") / "demo_robot_transfer.stderr.log").string(), + "transfer default stderr_log mismatch" + ); + const auto& robot = processes["robot_startup"]; require( robot["working_directory"].get() == (profile_dir / "runtime").string(), diff --git a/docs/designs/axon-agent-design.md b/docs/designs/axon-agent-design.md index bcef4a50..07790a4e 100644 --- a/docs/designs/axon-agent-design.md +++ b/docs/designs/axon-agent-design.md @@ -112,7 +112,7 @@ process: timeout_ms: 500 ``` -`adapter.yaml` 下的 `managed_processes.` 使用同一组字段。`working_directory` 的相对路径按 profile 根目录解析;`pid_file`、`metadata_file`、`stdout_log`、`stderr_log` 的相对路径按 agent `state_dir` 解析。未配置 `pid_file`、`metadata_file` 和日志路径时,agent 会自动按 `profile_id + process_id` 生成隔离路径。 +`adapter.yaml` 下的 `managed_processes.` 使用同一组字段。`working_directory` 的相对路径按 profile 根目录解析;`pid_file`、`metadata_file`、`stdout_log`、`stderr_log` 的相对路径按 agent `state_dir` 解析。未配置 `pid_file`、`metadata_file` 时,agent 会自动按 `profile_id + process_id` 生成隔离路径;未配置日志路径时,stdout/stderr 默认保存到 `/tmp/axon-agent/logs/_..log`,避免一次性子进程日志长期积累在持久 state 目录。 `health_check.type` 首版支持 `process`、`http`、`none`。`process` 只检查被管理进程 pid 是否仍在运行;`http` 支持 `url`、`timeout_ms` 和 `expected_status`,用于 recorder/transfer 等带本地 HTTP 端口的组件;`none` 用于明确关闭健康检查。 diff --git a/packaging/deb/agent/default/axon-agent b/packaging/deb/agent/default/axon-agent index 9f7c1029..1fdbe930 100644 --- a/packaging/deb/agent/default/axon-agent +++ b/packaging/deb/agent/default/axon-agent @@ -9,5 +9,7 @@ AXON_AGENT_PORT=8090 # contain adapter.yaml and optional recorder.yaml / transfer.yaml files. AXON_AGENT_PROFILE_PATH=/opt/axon/robots -# Runtime state, active_profile.json, child pid files, metadata, and logs. +# Runtime state, active_profile.json, child pid files, and metadata. +# Managed process stdout/stderr defaults to /tmp/axon-agent/logs unless a +# profile explicitly sets stdout_log/stderr_log. AXON_AGENT_STATE_DIR=/var/lib/axon/agent