温馨提示×

为何linux日志丢失数据

小樊
47
2026-09-14 14:29:31
栏目: 智能运维

Linux 日志“丢失数据”是一个常见但原因复杂的问题,通常不是真的凭空消失,而是未被记录、被覆盖、被过滤或未被采集到。下面按常见原因分类说明:


一、日志轮转(Log Rotation)导致“看起来丢失”

最常见原因。

现象

  • /var/log/messages/var/log/syslog 只保留最近几天
  • 旧日志变成 .gz 或被删除

原因

  • logrotate 按大小/时间切割
  • 保留策略过短(如 rotate 4

排查

ls -lh /var/log/
cat /etc/logrotate.conf
cat /etc/logrotate.d/*

解决

  • 增加保留份数
  • 延长保留时间
  • 接入集中日志(ELK / Loki)

二、系统崩溃 / 掉电导致缓冲未落盘

现象

  • 重启后某段时间日志完全缺失
  • 尤其是 kernel / boot 阶段

原因

  • 日志写在内存(tmpfs)
  • 未调用 fsync
  • 突然断电

典型位置

  • /run/log(tmpfs)
  • systemd-journald 若配置为 volatile

检查

Storage=auto
# 或
Storage=volatile

解决

  • 使用 Storage=persistent
  • 启用 sync 模式(性能有损耗)

三、日志级别 / 过滤导致未记录

现象

  • 明明有错误,但日志里没有

原因

  • 日志级别设置过高(只记 warning+)
  • 应用自身过滤
  • rsyslog / journald 规则丢弃

示例

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

解决

  • 降低日志级别
  • 检查应用配置
  • 检查 rsyslog.conf / journald.conf

四、磁盘满 / inode 耗尽

现象

  • 日志突然停止
  • 新日志写不进去

检查

df -h
df -i

解决

  • 清理日志
  • 调整 logrotate
  • 扩容或迁移日志目录

五、日志被覆盖(程序直接写文件)

现象

  • 日志内容不完整
  • 重启后旧内容消失

原因

  • 程序用 > 而非 >>
  • 多进程写同一文件无锁

解决

  • >>>
  • 使用 syslog / journald

六、systemd-journald 限制

常见限制

  • 按大小限制(SystemMaxUse
  • 按时间清理
  • 非持久化

查看

journalctl --disk-usage

配置

[Journal]
Storage=persistent
SystemMaxUse=2G
MaxRetentionSec=30d

七、集中日志采集丢失

如果你用:

  • Filebeat
  • Fluentd
  • rsyslog 转发

可能原因:

  • 网络中断
  • 缓冲满
  • 采集起点错误
  • 容器日志驱动问题

八、容器 / Kubernetes 场景

常见原因

  • docker logs 被 rotate
  • Pod 被重建
  • stdout 未采集

建议

  • 使用 json-file + max-size
  • 使用 DaemonSet 采集
  • 不依赖容器本地日志

总结一句话

Linux 日志“丢失”,90% 是轮转 + 缓冲 + 级别 + 磁盘问题,而不是系统 bug。

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

  • 哪个日志(syslog / journal / 应用日志)
  • 丢失的时间点
  • 是否容器 / 物理机

我可以帮你精准定位。

0