如何阻止syslog()消息发送至journal daemon
我来帮你解决这个问题——在Ubuntu 16.04里,systemd-journald默认会监听syslog的socket(/dev/log),所以你的应用通过syslog()发送的日志会同时被rsyslog和journald捕获,这不仅导致日志出现在journalctl里,还可能因为重复处理拉高CPU使用率。下面是两种可行的解决方式,你可以根据需求选择:
方法1:让journald停止监听syslog socket(推荐)
这种方法能彻底切断journald对syslog消息的捕获,从根源解决重复处理的问题:
- 编辑journald的配置文件:
sudo nano /etc/systemd/journald.conf - 找到
#SyslogSocket=这一行,去掉注释并修改为:
这个配置会让journald不再创建或监听syslog socket,所有syslog消息只会被rsyslog接收。SyslogSocket=null - 重启journald服务使配置生效:
sudo systemctl restart systemd-journald - 确认rsyslog已启用
imuxsock模块(它负责监听syslog socket):
打开/etc/rsyslog.conf,确保下面这行没有被注释:
如果被注释了,去掉注释后保存文件。$ModLoad imuxsock - 重启rsyslog服务:
sudo systemctl restart rsyslog
完成后,你的应用日志就只会按照rsyslog.conf的规则存入指定文件,不会再出现在journalctl输出中,CPU使用率也会随之下降。
方法2:仅阻止特定应用日志进入journald
如果你只想让自己应用的日志不进入journald,而保留其他系统日志的journal记录,可以在rsyslog规则中添加过滤:
- 找到rsyslog中处理你应用日志的规则(可能在
/etc/rsyslog.conf或/etc/rsyslog.d/下的配置文件里),假设你的应用日志用local0设施标识,或者有特定的tag(比如myapp)。 - 在写入日志文件的规则后添加
& stop,示例如下:
这会让rsyslog处理完这条日志后停止继续传递。不过要注意:这种方法仅在rsyslog优先于journald接收消息时有效,若journald仍直接监听syslog socket,可能还是会捕获到消息,所以方法1更稳妥。local0.* /var/log/myapp.log & stop
⚠️ 小提醒:修改配置前建议备份原文件,比如sudo cp /etc/systemd/journald.conf /etc/systemd/journald.conf.bak,避免配置出错无法恢复。
内容的提问来源于stack exchange,提问作者user1474341
相关产品推荐
相关产品推荐

