日志丢失或无法转发主因是配置、权限、资源或系统冲突,非rsyslog自身故障;需先确认服务状态(systemctl status rsyslog),再逐层验证语法(rsyslogd -N1)、路径权限、网络连通性(nc测试)、/dev/log抢占及磁盘空间与队列配置。

日志丢失或无法转发,多数不是 rsyslog 本身坏了,而是配置、权限、资源或系统级冲突没对上。排查要从服务状态入手,再逐层验证路径、网络和底层机制。
确认服务是否真在运行
很多“日志没了”其实只是服务停了或压根没启动。
- 运行 sudo systemctl status rsyslog,看状态是不是 active (running);如果是 inactive (dead) 或 failed,先尝试启动:sudo systemctl start rsyslog
- 检查是否开机自启:sudo systemctl is-enabled rsyslog,若显示 disabled,执行 sudo systemctl enable rsyslog
- 别忽略 journalctl 日志:用 sudo journalctl -u rsyslog -n 50 -f 实时看服务自身报错,比如 “Failed to open /dev/log” 或 “Could not open config file” 都直接指向根源
检查配置语法与目标路径
写错一个符号、少一个空格,rsyslog 就会静默跳过整条规则——它不报错,但也不干活。
- 用 rsyslogd -N1 检查配置语法,它会提示具体哪一行出错(如括号不匹配、缺少分号)
- 确认日志输出路径存在且可写:ls -ld /var/log/your-log-dir,常见权限应为 root:adm,若属主不对,执行 sudo chown -R root:adm /var/log/your-log-dir
- Ubuntu 默认可能禁用 /var/log/messages:打开 /etc/rsyslog.d/50-default.conf,取消注释类似 *.info;mail.none;authpriv.none;cron.none /var/log/messages 的行
验证远程转发是否真正生效
本地日志有,远程收不到?问题大概率不在 rsyslog 配置本身,而在通路或接收端。
- 确认转发语法:UDP 用 @host:514,TCP 用 @@host:514;端口写错、协议混用是高频失误
- 测连通性:nc -zv remote-host 514(TCP)或 nc -uzv remote-host 514(UDP);失败则查防火墙、SELinux、目标服务是否监听
- ARM 或嵌入式设备要特别注意:systemd-journald 可能抢占 /dev/log socket,导致 rsyslog 启动后无法获取日志源;临时关闭 journald socket:sudo systemctl stop systemd-journald-dev-log.socket,再重启 rsyslog 测试
排查日志丢弃的隐藏原因
日志“看起来丢了”,有时是被轮转删了、被磁盘满挤掉了,或是队列溢出后直接丢弃。
- 查磁盘空间:df -h /var/log,Use% 超过 90% 时,rsyslog 可能拒绝写入或丢弃新日志
- 看轮转痕迹:ls -lt /var/log/syslog*,若存在 syslog.1.gz、syslog.2.gz 等,说明旧日志被压缩归档,不是丢了,是移走了
- 转发延迟或丢包?检查队列配置:在 rsyslog 配置中添加磁盘队列(避免内存满丢日志),例如:
$ActionQueueType LinkedList
$ActionQueueFileName fwdqueue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on

















