温馨提示×

Debian syslog为何丢失

小樊
51
2026-07-07 20:50:22
栏目: 智能运维

Debian 的 syslog(通常指 rsyslogsyslog-ng)出现“日志丢失”是一个常见问题,通常不是单一原因造成的。下面按最常见到最容易被忽略的顺序,帮你系统排查。


一、最常见原因

1. rsyslog 服务未运行

systemctl status rsyslog

如果未运行:

systemctl start rsyslog
systemctl enable rsyslog

2. 日志被 journald 接管(systemd-journald)

Debian 默认使用 systemd-journald,很多日志不再写入 /var/log/syslog,而是存在 journal 中。

查看:

journalctl -xe

确认是否启用了 rsyslog 转发:

cat /etc/rsyslog.conf | grep imjournal

典型情况:

  • /var/log/syslog 为空
  • journalctl 里却有日志

✅ 这是最常见原因之一


3. 日志被轮转(logrotate)删除了

检查:

ls -lh /var/log/syslog*
ls -lh /var/log/messages*

查看轮转配置:

cat /etc/logrotate.d/rsyslog

常见问题:

  • 日志被压缩成 .gz
  • 保留天数设置过小

4. 磁盘空间 / inode 耗尽

df -h
df -i

如果磁盘满或 inode 满,syslog 会直接停止写入。


5. SELinux / AppArmor 限制(较少见)

Debian 默认用 AppArmor

aa-status

某些程序(如自定义 daemon)可能被限制写日志。


二、配置相关原因

6. rsyslog 配置过滤掉了日志

检查:

grep -R "stop\|discard\|~" /etc/rsyslog.conf /etc/rsyslog.d/

例如:

*.* stop

会导致后续规则不再处理。


7. 程序日志级别设置过高

例如:

*.err

会导致 info / debug 不记录。

✅ 临时测试:

*.*    /var/log/syslog

8. 程序未使用 syslog

某些程序:

  • 直接写自己的 log 文件
  • 或只输出到 stdout/stderr(systemd 接管)

典型例子:

  • Docker 容器
  • Python、Java 应用
  • 自定义 systemd service

三、systemd 场景特有原因

9. 服务 StandardOutput 未指向 syslog

StandardOutput=journal
StandardError=journal

不会进入 /var/log/syslog


10. rsyslog 未监听 journal

确认:

ls /usr/lib/rsyslog/imjournal.so

配置中应包含:

module(load="imjournal")

四、推荐排查顺序(快速版)

# 1. 服务状态
systemctl status rsyslog

# 2. journal 是否有日志
journalctl -xe

# 3. 磁盘
df -h

# 4. 日志文件
ls -lh /var/log/syslog*

# 5. 重新启动 rsyslog
systemctl restart rsyslog

五、如何确认“到底丢没丢”

对比:

journalctl -u 服务名
cat /var/log/syslog | grep 服务名

如果 journal 有,syslog 没有 → 这是正常现象,不是 bug。


六、什么时候这是“正常行为”

✅ 以下情况属于正常:

  • Debian 使用 systemd
  • /var/log/syslog 只记录部分日志
  • 应用日志只进 journal

✅ 如果你想“全部进 syslog”:

  • 启用 imjournal
  • 或让程序直接写 syslog

如果你愿意,可以告诉我:

  1. Debian 版本(cat /etc/debian_version
  2. 丢失的是 哪个服务 的日志
  3. /var/log/syslog 是否存在、是否为空

我可以帮你精确定位是哪一种情况

0