来源:lzhou | 发布日期:2026-06-20
服务器凌晨 3 点重启,
dmesg -T一看是空的——内核日志没持久化,重启就丢。
问题:为什么 dmesg 重启后就空了
内核日志存储在内核内存的环形缓冲区(Ring Buffer)中:大小固定,新日志覆盖旧日志,断电即消失。dmesg 命令读的就是这个缓冲区。
开发机丢了无所谓,但生产环境一次 OOM、一次硬件异常、一次网卡 down,重启前没保存日志,排查就是盲人摸象。
一行配置:rsyslog 持久化内核日志
# 在 /etc/rsyslog.conf 末尾追加一行
kern.* /var/log/kern.log
kern— 设施(facility),代表内核.*— 所有级别(debug 到 emerg)/var/log/kern.log— 输出文件
配置后重启生效:
systemctl restart rsyslog
systemctl status rsyslog
批量部署脚本
使用运维作业平台(蓝鲸/SaltStack/Ansible)下发:
#!/bin/bash
config_line="kern.* /var/log/kern.log"
if grep -Fxq "$config_line" /etc/rsyslog.conf; then
echo "配置已存在,无需修改。"
else
echo "$config_line" >> /etc/rsyslog.conf
echo "已添加配置行。"
systemctl restart rsyslog
systemctl status rsyslog
fi
grep -Fxq 中的 -F 固定字符串、-x 整行匹配、-q 静默输出,确保幂等安全。
验证方法
用 drop_caches 模拟内核事件(仅测试环境):
echo 1 > /proc/sys/vm/drop_caches
cat /var/log/kern.log
应看到类似 kernel: dropped cache: 12345 pages 的记录,说明内核日志已持久化到文件。
进阶:按级别拆分
| 配置 | 输出文件 | 范围 |
|---|---|---|
kern.* |
/var/log/kern.log |
全部级别 |
kern.err |
/var/log/kern-error.log |
错误及以上 |
kern.warn |
/var/log/kern-warn.log |
警告及以上 |
kern.=info |
/var/log/kern-info.log |
仅信息 |
排查时直接看 kern-error.log,免去海量日志干扰。
systemd-journald 持久化
journald 默认将日志存 /run/log/journal/(内存,重启丢)。改为持久化:
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
# 确认 /etc/systemd/journald.conf 中 Storage=persistent
systemctl restart systemd-journald
永久保存后可用 journalctl -k 查看内核日志,按 --since 回溯。
日志轮转
# /etc/logrotate.d/kern
/var/log/kern.log /var/log/kern-error.log /var/log/kern-warn.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
关联页面
| 页面 | 关联点 |
|---|---|
| journalctl-log-tracking-guide | systemd journalctl 命令完全指南,日志实时追踪 |
| linux-kernel-tuning-production | 内核参数调优与生产环境配置 |
| linux-perf-troubleshooting-handbook | Linux 性能排查实战手册 |
| server-security-hardening-checklist | 服务器安全加固清单,含日志审计配置 |
| linux-essential-commands-reference | Linux 运维必备命令速查 |