linux应用stdout/stderr需经重定向或代理才能被rsyslog采集,因其不监听进程流;推荐systemd+journal方案,次选logger中转,imfile监控文件为慎用备选。

Linux 应用默认的标准输出(stdout)和标准错误(stderr)不会自动进入 rsyslog,必须通过显式重定向或中间代理才能被采集。核心思路是:让应用日志“变成 syslog 消息”,而不是直接写文件或终端。
为什么不能直接捕获 stdout?
rsyslog 本身不监听进程的 stdout/stderr 流。它只接收三类输入:
- 本地进程调用 syslog() 函数写入
/dev/logsocket - 内核通过
/proc/kmsg输出的日志 - 网络传入的 syslog 协议消息(UDP/TCP)
所以,单纯运行 ./myapp >& /var/log/myapp.log 不会触发 rsyslog 记录——那只是普通文件写入,rsyslog 完全不知情。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
推荐方案:用 systemd 服务 + StandardOutput=journal
现代 Linux(RHEL/CentOS 7+、Ubuntu 16.04+)普遍使用 systemd 管理守护进程,这是最简洁可靠的方式:
- 在服务单元文件(如
/etc/systemd/system/myapp.service)中配置:
[Service] Type=simple ExecStart=/usr/local/bin/myapp StandardOutput=journal StandardError=journal Restart=on-failure
- 启用并启动服务:
systemctl daemon-reload && systemctl enable --now myapp - 此时所有 stdout/stderr 会被 journald 接收,并可由 rsyslog 通过
imjournal模块统一拉取 - 确保 rsyslog 已加载该模块:检查
/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf中有module(load="imjournal")
无 systemd 环境:用 logger 命令中转
对传统 init 脚本或临时调试场景,可用 logger 将 stdout 转为 syslog 消息:
- 启动命令改写为:
/usr/local/bin/myapp 2>&1 | logger -t "myapp" -p local0.info -
-t "myapp"设置标签,出现在$programname字段 -
-p local0.info指定 facility 和 level,避免与系统日志混杂 - 配合 rsyslog 配置规则,例如:
local0.info /var/log/myapp.log
进阶:用 imfile 监控日志文件(慎用)
若应用只能写文件(如 myapp.log),可让 rsyslog 主动读取该文件:
- 加载模块:
module(load="imfile" PollingInterval="10") - 定义输入:
input(type="imfile"
File="/var/log/myapp.log"
Tag="myapp:"
Severity="info"
Facility="local0")
- 注意:此方式存在延迟、重复读取、日志轮转(logrotate)兼容性等问题,仅建议临时或低频场景使用
- 务必配合
statefile防止重启后重发旧日志










