温馨提示×

linux syslog为何丢失

小樊
40
2026-07-29 20:41:18
栏目: 智能运维

Linux 的 syslog 丢失通常不是“没写”,而是被丢弃、覆盖、缓冲、过滤或配置不当导致的。下面按最常见原因 → 排查思路 → 解决建议系统说明。


一、最常见原因(80% 都在这里)

1️⃣ systemd-journald 与 rsyslog/syslog-ng 不一致

现代 Linux(CentOS 7+、Ubuntu 16+)默认用 systemd-journald,而传统 syslog 只是“消费者”。

常见现象:

  • journalctl 能看到日志
  • /var/log/messages/var/log/syslog 没有

原因:

  • rsyslog 没启动
  • rsyslog 没监听 journal
  • journal 被清理(size/time 限制)

✅ 检查:

systemctl status rsyslog
journalctl -u rsyslog

✅ 解决:

systemctl enable --now rsyslog

并确保 rsyslog 加载 journal 模块:

module(load="imjournal")

2️⃣ 日志被 rate limit(非常常见)

systemd-journald 默认限速

  • 1000 条 / 30 秒(默认)
  • 超出的直接丢弃

典型场景:

  • 程序疯狂打印日志
  • 网络抖动、异常循环

✅ 查看:

journalctl -u your_service

✅ 解决(临时):

# /etc/systemd/journald.conf
RateLimitInterval=0
RateLimitBurst=0

然后:

systemctl restart systemd-journald

3️⃣ rsyslog 自身限速(imuxsock)

rsyslog 也有 rate limit:

$SystemLogRateLimitInterval 0
$SystemLogRateLimitBurst 0

否则:

  • 高频日志直接丢弃
  • 不报错、不提示

4️⃣ 日志被 rotate 后未 reload

日志轮转(logrotate)后:

  • rsyslog 仍写旧 fd
  • 新文件无日志

✅ 检查:

ps aux | grep rsyslog
lsof | grep deleted

✅ 解决:

systemctl reload rsyslog

或 logrotate 配置中加:

postrotate
  /usr/bin/systemctl reload rsyslog
endscript

5️⃣ 磁盘满 / inode 满

syslog 不会报错,直接写失败

✅ 检查:

df -h
df -i

✅ 解决:

  • 清理磁盘
  • 调整日志保留策略

6️⃣ 日志级别被过滤

rsyslog 默认可能忽略 debug / info

例如:

*.info;mail.none;authpriv.none;cron.none    /var/log/messages

→ debug 日志直接丢失

✅ 解决:

*.debug    /var/log/debug.log

7️⃣ 程序输出到 stdout/stderr,但没进 syslog

systemd 服务:

  • stdout 在 journal
  • rsyslog 默认不转发

✅ 解决:

[Service]
StandardOutput=syslog
StandardError=syslog

或 rsyslog:

module(load="imjournal")

8️⃣ journal 被清理(size / time)

journal 有大小限制:

journalctl --disk-usage

默认:

  • 10% 磁盘
  • 或 4G

✅ 调整:

# /etc/systemd/journald.conf
SystemMaxUse=1G
MaxRetentionSec=7day

二、快速自检清单(强烈建议照着做)

systemctl status rsyslog
systemctl status systemd-journald

journalctl -u your_service

cat /etc/systemd/journald.conf
cat /etc/rsyslog.conf
df -h
df -i

三、如何“彻底避免 syslog 丢失”

✅ 生产环境推荐组合:

  1. journald + rsyslog
  2. 关闭 rate limit
  3. 明确日志级别
  4. 磁盘监控
  5. 关键日志写文件 + 转发 ELK / Loki

四、如果你愿意,我可以进一步帮你

你可以直接贴:

  • Linux 发行版 + 版本
  • 用的是 rsyslog 还是 syslog-ng
  • 丢失的是 哪个服务 / 哪类日志
  • 是否 systemd 服务

我可以精确告诉你哪一行配置在丢日志

0