返回首页

内核日志持久化指南 — 从 rsyslog 到 journalctl 配置详解

📅 创建于 2026-06-24 🔄 更新于 2026-06-24 📝 228 字

来源: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-guidesystemd journalctl 命令完全指南,日志实时追踪
linux-kernel-tuning-production内核参数调优与生产环境配置
linux-perf-troubleshooting-handbookLinux 性能排查实战手册
server-security-hardening-checklist服务器安全加固清单,含日志审计配置
linux-essential-commands-referenceLinux 运维必备命令速查