温馨提示×

为什么linux syslog丢失

小樊
76
2026-10-07 15:38:13
栏目: 智能运维

Linux 下 syslog 丢失是一个常见问题,通常不是“日志被删了”,而是写入路径、权限、缓冲、配置或存储某一环出了问题。下面按最常见原因 → 排查方法 → 解决办法来说明。


一、最常见原因总结(先记住这 6 类)

  1. rsyslog / syslog-ng 服务没运行
  2. 日志被重定向到别的位置(journald)
  3. 磁盘写满 / inode 用完
  4. 日志被 rotate 后未 reopen(文件句柄问题)
  5. 程序用了 stdout / stderr 而不是 syslog
  6. 异步写入 + 系统崩溃,缓冲未刷盘

二、逐步排查(实用)

1️⃣ syslog 服务是否真的在跑

ps aux | grep rsyslog
# 或
systemctl status rsyslog

如果没跑:

systemctl start rsyslog
systemctl enable rsyslog

⚠️ 很多“丢失”其实是服务根本没启动


2️⃣ 日志其实在 journald,不在 /var/log

现代系统(CentOS 7+、Ubuntu 16+):

journalctl -xe

如果你只查 /var/log/messages 却什么都没有,但 journalctl 有:

  • 说明 syslog 没转发
  • systemd 把日志接管了

解决:

# /etc/rsyslog.conf
module(load="imjournal")

3️⃣ 磁盘或 inode 满了(非常常见)

df -h
df -i

如果 /var 满了:

  • 新日志写不进去
  • 老日志可能被静默丢弃

解决:

  • 清理日志
  • 调整 logrotate

4️⃣ logrotate 后没 reopen 文件

很多程序(包括 rsyslog 自己)不会自动重新打开被 mv 的日志

表现:

  • 日志文件存在但 0 字节
  • 或日志写到已删除文件

检查:

lsof | grep deleted

解决:

systemctl restart rsyslog

或在 logrotate 中加:

postrotate
  systemctl kill -s HUP rsyslog
endscript

5️⃣ 应用根本没写 syslog

很多程序:

  • 只写 stdout
  • 或写自己的 log 文件

例如 Docker / Java / Python:

docker logs xxx

或检查程序配置:

log4j.syslog=false

解决:

  • 改程序配置
  • 或用 logger 测试
logger "test message"
tail /var/log/messages

6️⃣ 崩溃 / 断电导致缓冲丢失

rsyslog 默认异步 系统崩溃时:

  • 内存里的日志直接没了

解决(关键业务):

# rsyslog.conf
$ActionFileEnableSync on

或:

  • 用 omfile + flushInterval
  • 或直接写 Kafka / 远端 syslog

三、最稳妥的架构建议

不要只依赖本地 syslog

✅ 推荐:

  • 本地 rsyslog
  • 转发到远端:
    • 另一台 syslog server
    • ELK / Loki
    • 云日志

示例:

*.* @@logserver:514

四、快速自检清单 ✅

  • [ ] rsyslog 在运行
  • [ ] /var/log 有空间
  • [ ] journalctl 有日志
  • [ ] logrotate 会 HUP
  • [ ] 程序确实调用 syslog
  • [ ] 重要日志同步刷盘

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

  • 发行版(CentOS / Ubuntu / Alpine)
  • 用的 syslog(rsyslog / syslog-ng)
  • 丢的是 系统日志还是应用日志

我可以直接帮你定位到具体配置文件。

0 踩