温馨提示×

为何linux syslog丢失

小樊
66
2026-09-20 01:03:00
栏目: 智能运维

Linux 下 syslog 丢失(日志没写进去、写不全、或被覆盖)是很常见的问题,原因通常可以归为以下几类。我按「最常见 → 较少见」给你梳理,并给出排查方法。


一、最常见原因

1. rsyslog / syslog-ng 服务未运行或异常

systemctl status rsyslog
# 或
systemctl status syslog-ng

如果服务挂了、重启失败,日志就不会落盘。

表现:

  • /var/log/messages 不更新
  • logger "test" 无反应

解决:

systemctl restart rsyslog
journalctl -u rsyslog -e

2. 日志被 journald “截胡”(systemd 系统)

在现代系统里:

  • systemd-journald 收日志
  • rsyslog 从 journal 取日志

如果 rsyslog 没配置 @@ 或 imjournal,就会“看起来丢了”。

检查:

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

否则很多服务日志只在 journalctl 里能看到。


3. 日志被 rotate 截断 / 覆盖

logrotate 配置不当会:

  • 直接清空
  • 不通知 rsyslog 重新打开文件

典型错误:

/var/log/messages {
    copytruncate   # 忘记 restart syslog
}

结果:rsyslog 仍写旧 fd,新文件无内容。


4. 磁盘满 / inode 耗尽

df -h
df -i

现象:

  • 日志突然停止
  • 无报错或只在内核日志出现

5. 日志级别(priority)过滤

syslog 按级别过滤:

emerg < alert < crit < err < warning < notice < info < debug

如果你的程序只发 debug,但配置是:

*.info

那 debug 日志直接丢。


二、程序侧常见原因

6. 程序用错 facility

例如程序发到 local0,但 syslog 没配:

local0.* /var/log/app.log

7. 日志写入太快,缓冲区未 flush

  • 非阻塞 syslog
  • 程序崩溃前未 flush

多见于:

  • C / Go 程序
  • 容器环境

三、系统/环境原因

8. 容器环境无 syslog

Docker 容器:

  • 默认 没有 /dev/log
  • 日志只进 container log

解决:

docker run -v /dev/log:/dev/log

9. 权限问题

  • /var/log 不可写
  • SELinux / AppArmor 拦截

排查:

ausearch -m avc
dmesg | grep audit

四、快速自查清单(建议按顺序)

1. systemctl status rsyslog
2. df -h && df -i
3. journalctl -u rsyslog -e
4. logger test && tail /var/log/messages
5. 检查 /etc/rsyslog.conf 和 logrotate 配置

五、如果你愿意,我可以更精准帮你

你可以补充:

  • Linux 发行版(CentOS / Ubuntu / Alpine?)
  • 用的 syslog(rsyslog / syslog-ng / busybox)
  • 丢的是 系统日志 还是 某个程序日志
  • 是否在 容器 / 嵌入式 / 云服务器

我可以直接给你对应的配置示例。

0 踩