温馨提示×

debian syslog为何丢日志

小樊
50
2026-09-14 19:17:41
栏目: 智能运维

Debian 下 syslog 丢日志是一个比较常见的问题,原因通常不是“真的丢了”,而是被缓冲、被覆盖、被限流或配置不当。下面按最常见原因 → 排查方法 → 解决建议来说明。


一、最常见原因

1. systemd-journald 与 rsyslog 的关系没理清

Debian 默认:

  • systemd-journald 收集所有日志
  • rsyslog 从 journal 读日志,再写 /var/log

如果 journal 没开持久化:

  • 重启后日志消失
  • 高负载时 journal 丢弃旧日志

✅ 检查:

ls /var/log/journal

如果没有这个目录,说明 日志只存在内存里

✅ 解决:

mkdir -p /var/log/journal
systemctl restart systemd-journald

2. rsyslog 使用异步写入(缓冲)导致丢

rsyslog 默认可能使用:

  • 内存队列
  • 异步文件写

在高并发或崩溃时:

  • 队列没 flush
  • 日志直接丢失

✅ 检查 rsyslog 配置:

grep -R "Action" /etc/rsyslog.conf /etc/rsyslog.d/

✅ 更安全的写法:

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

并确保:

$ActionFileEnableSync on

3. journald 限流(Rate Limit)

systemd 默认限流:

  • 每 10 秒最多 1000 条
  • 超了直接丢

✅ 现象:

  • 批量日志突然“断片”
  • journalctl 里也没有

✅ 查看是否被限流:

journalctl -u your-service

✅ 修改限流(/etc/systemd/journald.conf):

RateLimitIntervalSec=0
RateLimitBurst=0

然后:

systemctl restart systemd-journald

4. 磁盘满 / inode 满

这是最容易被忽略的。

✅ 检查:

df -h
df -i

✅ 表现:

  • 日志突然停
  • 服务还在跑

✅ 解决:

  • 清理日志
  • 配置 logrotate

5. logrotate 配置不当

错误示例:

  • postrotate
  • rsyslog 没重新打开文件

✅ 正确示例:

/var/log/messages {
    rotate 7
    daily
    missingok
    notifempty
    compress
    postrotate
        /usr/bin/systemctl kill -s HUP rsyslog.service
    endscript
}

6. 程序直接写 stdout,但被吞了

容器 / systemd 服务:

  • 日志只进 journal
  • rsyslog 没捕获

✅ 检查:

journalctl -u your-service

✅ 解决:

  • 程序改为写 syslog
  • 或确保 journal 持久化

二、快速排查清单(建议照做)

# 1. 是否持久化
ls /var/log/journal

# 2. 是否限流
grep -E "RateLimit" /etc/systemd/journald.conf

# 3. 磁盘
df -h; df -i

# 4. rsyslog 是否活着
systemctl status rsyslog

# 5. 对比 journal 和文件
journalctl -n 50
tail -n 50 /var/log/syslog

三、如果你愿意,我可以更精准定位

你可以补充:

  1. Debian 版本(cat /etc/debian_version
  2. 用的 rsyslog 还是 syslog-ng
  3. 丢的是 系统日志 / 应用日志 / 某个服务
  4. 是否 重启后丢 / 实时丢

我可以直接给你一份可落地的配置

0