温馨提示×

ubuntu syslog为何丢日志

小樊
47
2026-09-08 02:52:18
栏目: 智能运维

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


一、最常见原因

1️⃣ systemd-journald 与 rsyslog 冲突(非常常见)

Ubuntu 现在默认用 systemd-journald,而 syslog(rsyslog)只是从 journal 里取数据。

如果 journal 被限流,rsyslog 就收不到日志。

典型表现

  • journalctl 有日志
  • /var/log/syslog 没有
  • 重启后日志恢复一部分

原因

# /etc/systemd/journald.conf
RateLimitInterval=30s
RateLimitBurst=1000

日志太多会被丢弃。

✅ 解决:

sudo vim /etc/systemd/journald.conf

修改为:

RateLimitInterval=0
RateLimitBurst=0

然后:

sudo systemctl restart systemd-journald

2️⃣ rsyslog 限流(imuxsock / imjournal)

rsyslog 自身也会限速。

常见配置

# /etc/rsyslog.conf
$SystemLogRateLimitInterval 0
$SystemLogRateLimitBurst 0

或新版:

module(load="imjournal" RateLimit.Interval="0" RateLimit.Burst="0")

✅ 修改后:

sudo systemctl restart rsyslog

3️⃣ 日志文件被 logrotate 截断

Ubuntu 默认:

/var/log/syslog
/var/log/auth.log

每天 rotate。

如果:

  • 日志很大
  • 程序没 reopen 文件

就会写到旧 inode,看起来像“丢日志”。

✅ 检查:

ls -li /var/log/syslog*

✅ 解决: 确保 rsyslog 支持 copytruncate 或 rotate 后 reload。


4️⃣ 磁盘满 / inode 满

df -h
df -i

如果 /var 满了,syslog 会直接停止写。

✅ 清理或扩容。


5️⃣ rsyslog 崩溃或卡死

systemctl status rsyslog
journalctl -u rsyslog

常见错误:

  • 配置语法错误
  • 远程 syslog 卡住(TCP 阻塞)

✅ 临时关闭远程日志测试。


6️⃣ 应用直接写 stdout(Docker / systemd)

很多程序:

  • 不写 syslog
  • 只写 stdout

结果:

  • journalctl -u xxx
  • /var/log/syslog 没有

✅ 这是正常行为,不是丢。


二、快速排查清单 ✅

# 1. journal 有没有
journalctl -n 100

# 2. syslog 有没有
tail -n 100 /var/log/syslog

# 3. rsyslog 状态
systemctl status rsyslog

# 4. 是否限流
grep -R RateLimit /etc/systemd/journald.conf /etc/rsyslog.conf

# 5. 磁盘
df -h /var

三、推荐的稳定配置(生产环境)

journald

Storage=persistent
RateLimitInterval=0
RateLimitBurst=0

rsyslog

$SystemLogRateLimitInterval 0
$SystemLogRateLimitBurst 0

四、如果你愿意

你可以告诉我:

  • Ubuntu 版本(22.04 / 20.04
  • 用的是 rsyslog 还是 syslog-ng
  • 系统日志丢还是某个程序日志丢

我可以直接帮你给一份精准配置

0