当 rsyslog
使用 imuxsock
模块时,如果 长时间没有日志 输出,可能原因有多种,需要结合 Linux 系统日志流转机制逐步排查。下面详细解释 imuxsock
的原理、可能原因和排查步骤。
1. imuxsock
工作原理
imuxsock
模块用于接收 本地进程通过 Unix Domain Socket 发送的日志,这是 Linux 中最常见的日志收集路径。
日志流转路径
yaml
Application (e.g., systemd, sshd)
|
v
libc syslog()/journald
|
v
Unix Socket: /dev/log <--- imuxsock 模块监听
|
v
rsyslog ---> 按配置写到文件 /var/log/messages 或远程发送
/dev/log
是 Unix Socket 文件,由 rsyslog 或 systemd-journald 创建。imuxsock
模块负责监听/dev/log
,从而接收应用程序日志。
如果
/dev/log
出现问题,imuxsock
将无法接收任何日志。
2. 没有日志的常见原因
原因 1:应用层没有产生日志
- 很多应用只有在有事件发生时才输出日志。
- 如果这段时间系统比较空闲,应用没有调用
syslog()
或logger
,rsyslog
自然收不到日志。
排查方法:
bash
logger "test message"
tail -n 20 /var/log/messages
- 如果
test message
没有出现,说明日志没有流转到 rsyslog。
原因 2:/dev/log
Socket 丢失或损坏
imuxsock
依赖/dev/log
这个 Unix Socket 文件。- 如果
/dev/log
被误删或被其他进程占用,日志无法接收。
检查:
bash
ls -l /dev/log
# 正常输出示例
# srw-rw-rw-. 1 root root 0 Sep 23 10:20 /dev/log
排查:
-
如果文件不存在,重启
systemd-journald
或rsyslog
:systemctl restart systemd-journald systemctl restart rsyslog
-
如果文件被非
systemd-journald
占用,找出占用进程:perllsof | grep /dev/log
原因 3:rsyslog 配置错误
如果 rsyslog
没有正确加载 imuxsock
模块或配置了错误的规则,日志也不会输出。
检查配置文件:
bash
grep imuxsock /etc/rsyslog.conf /etc/rsyslog.d/*.conf
配置示例:
ini
module(load="imuxsock") # Load imuxsock module
⚠️ 如果找不到
module(load="imuxsock")
,说明模块未加载,需手动添加并重启:
systemctl restart rsyslog
原因 4:systemd-journald 抢占日志
在很多现代 Linux 发行版(如 SLES15, RHEL8/9, Ubuntu),
systemd-journald
默认先接管 /dev/log
,然后再将日志转发给 rsyslog。
如果 journald 配置错误或未启用日志转发,rsyslog 就收不到日志。
检查 journald 配置:
bash
grep ForwardToSyslog /etc/systemd/journald.conf
需要确保:
ini
ForwardToSyslog=yes
修改后重启:
systemctl restart systemd-journald
原因 5:rsyslog 队列阻塞
rsyslog
内部有多级队列,如果日志量过大或磁盘写入缓慢,可能导致队列阻塞,使得新日志无法写入。
检查队列状态:
rsyslogd -N1
- 确认配置语法无误。
查看 /var/log/messages
或 /var/log/rsyslog.log
是否有队列相关错误。
原因 6:日志被过滤规则丢弃
如果 /etc/rsyslog.conf
中配置了过于严格的过滤规则,某些日志会被直接丢弃。
检查:
bash
grep -E '^*' /etc/rsyslog.conf
确保有类似规则:
javascript
*.* /var/log/messages
如果被限制为:
bash
*.info /var/log/messages
那么 debug
级别日志就不会被写入。
原因 7:权限问题
/dev/log
的权限不足,导致某些进程无法写入。- 日志文件目录权限不足,导致 rsyslog 无法写入日志。
检查:
bash
ls -l /dev/log
ls -ld /var/log
正常
/dev/log
权限应该是srw-rw-rw-
,即所有用户都可以写入。
3. 排查流程总结
步骤 | 命令 | 目标 |
---|---|---|
1 | logger "test message" |
确认是否是应用层没有日志 |
2 | ls -l /dev/log |
检查 /dev/log 是否存在 |
3 | `lsof | grep /dev/log` |
4 | grep imuxsock /etc/rsyslog.conf |
确认模块已加载 |
5 | grep ForwardToSyslog /etc/systemd/journald.conf |
确认 journald 是否转发日志 |
6 | 检查 /var/log/rsyslog.log |
查看 rsyslog 自身错误 |
7 | 检查 /etc/rsyslog.conf 过滤规则 |
确认日志没有被丢弃 |
4. 示例:快速修复脚本
如果怀疑是 journald 或 /dev/log
问题,可以一次性重启日志服务:
systemctl restart systemd-journald
systemctl restart rsyslog
然后测试:
bash
logger "test message"
tail -n 10 /var/log/messages
5. 总结
可能原因 | 特征 | 解决方案 |
---|---|---|
应用无日志输出 | logger 也没输出 |
确认应用日志逻辑 |
/dev/log 丢失 |
ls /dev/log 不存在 |
重启 journald/rsyslog |
模块未加载 | 配置文件无 imuxsock |
添加并重启 rsyslog |
journald 未转发 | ForwardToSyslog=no |
改为 yes 并重启 |
队列阻塞 | rsyslog 日志中有队列警告 | 检查磁盘和队列配置 |
过滤规则过严 | 低级别日志消失 | 调整 *.info → *.* |
权限不足 | ls -l /dev/log 权限不对 |
修正权限为 srw-rw-rw- |
6. 经验建议
-
统一日志管理
确保 journald 与 rsyslog 配置一致,避免二者竞争
/dev/log
。 -
启用 rsyslog debug 日志
rsyslogd -dn
运行后观察输出,快速定位问题。
-
监控
/dev/log
状态使用脚本定时检查
/dev/log
是否被替换或删除。