在 systemd 单元文件中,需将 StandardOutput=syslog 和 StandardError=syslog 显式设置,并指定 SyslogIdentifier=myapp,才能将应用日志直接路由到 Syslog;同时确保 rsyslog 正常运行且可通过 $programname 规则分流日志。

在 systemd 单元文件中,将应用日志直接路由到 Syslog,关键在于正确设置 StandardOutput 和 StandardError 为 syslog,并配合 SyslogIdentifier 明确标识日志来源。
明确配置 StandardOutput 和 StandardError
这两个选项必须显式设为 syslog(不能是 journal 或文件路径),否则日志不会发往 rsyslog/syslogd:
-
StandardOutput=syslog—— 将 stdout 输出交由 syslog 守护进程接收 -
StandardError=syslog—— 将 stderr 同样交由 syslog 处理 - 二者可独立设置,例如只把错误日志发 syslog、正常日志走 journal,但“直接路由到 Syslog”需两者都设为
syslog
必须指定 SyslogIdentifier
这是 syslog 能区分不同服务的关键字段。不设或设为空会导致日志混入 generic facility(如 user.info),难以过滤:
-
SyslogIdentifier=myapp—— 日志行前会标记myapp:,rsyslog 可据此规则分流 - 该标识符会作为
PROGRAM字段出现在 syslog 格式中,影响/var/log/syslog或自定义日志文件的归类 - 若未设置,systemd 默认使用服务名(如
myapp.service中的myapp),但显式声明更可靠、更易维护
确保 syslog 后端已就绪
systemd 发送 syslog 消息依赖本地 syslog 实现(如 rsyslog 或 syslog-ng)。需确认:
- rsyslog 已安装并运行:
systemctl is-active rsyslog应返回active - rsyslog 配置中启用
imjournal模块(用于接收 journald 日志)不是必需的——因为这里走的是传统 syslog socket(/dev/log),而非 journal 接口 - 如需按
SyslogIdentifier拆分日志,需在/etc/rsyslog.d/下添加规则,例如:
& stop
完整 service 单元示例
一个最小可用配置如下:
[Service]ExecStart=/usr/local/bin/myapp
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
User=myapp
Group=myapp
修改后执行:systemctl daemon-reload && systemctl restart myapp,随后可在 /var/log/syslog 中搜索 myapp: 验证效果。



















