银河麒麟V10日志排障:journalctl从入门到生产实战

适用场景:麒麟系统上服务异常无日志、磁盘被日志撑爆、排查系统启动失败——journalctl 是 systemd 生态下的统一日志查询工具,本文从基础命令到生产排障全流程覆盖。

1. 背景与适用场景

某次在麒麟 V10 上排查 Nginx 502 问题,翻 /var/log/nginx/error.log 只看到一行 “connect() failed”,根本看不出原因。后来用 journalctl -u nginx -f 实时跟踪,发现是后端 PHP-FPM 的 socket 被 OOM killer 干掉了,日志里明明白白显示 “out of memory”。

journalctl 聚合了 systemd 管理下所有服务的日志,kernel、服务、用户级别都在一起,不用再翻十几个 /var/log/ 的文件。对麒麟运维来说,这是排查启动故障、服务挂死、OOM、内核 panic 的第一入口。

2. 环境与前置条件

# 查看 systemd 版本(麒麟 V10 默认 219+)
systemctl --version

# 确保日志持久化(默认重启丢日志,需要改配置)
cat /etc/systemd/journald.conf | grep Storage
# 改为 Storage=persistent 并创建目录
sed -i 's/^#Storage=.*/Storage=persistent/' /etc/systemd/journald.conf
mkdir -p /var/log/journal
systemctl restart systemd-journald

# 查看当前日志占用
journalctl --disk-usage
# Archived and active journals take up 8.0M on disk

3. 操作步骤

3.1 最常用的排障套路

# ① 看当前启动的系统日志(服务异常首选)
journalctl -b -p err --no-pager

# ② 跟踪指定服务的实时日志(类似 tail -f)
journalctl -u nginx -f

# ③ 查看指定时间段
journalctl --since "2026-07-30 09:00:00" --until "2026-07-30 10:00:00"

# ④ 看 kernel 日志(硬件/驱动问题)
journalctl -k

# ⑤ 合并多个 Unit 日志交叉分析
journalctl -u nginx -u php-fpm --since today --no-pager

3.2 日志配置优化(麒麟 V10 生产建议)

# /etc/systemd/journald.conf 关键参数
# Storage=persistent           # 日志持久化,重启不丢
# SystemMaxUse=4G              # 日志最大 4G,防止 /var/log 撑爆
# SystemMaxFileSize=100M       # 单文件最大 100M
# MaxRetentionSec=1month       # 保留 1 个月,满足审计要求

4. 验证结果

# 持久化生效确认
journalctl --disk-usage
# 返回 >0M 即表示持久化成功

# 故障复现:让一个服务崩溃
systemctl restart nginx
journalctl -u nginx -b --no-pager | tail -20
# 会看到具体的启动失败原因(端口冲突/配置语法错误/权限不足)

# JSON 格式输出,方便脚本分析
journalctl -u nginx -o json-pretty --since "5 min ago" | head -30

排障流程图:服务异常 → systemctl status 看状态 → journalctl -u 服务名 -b -p err 查错误 → 按 _PID 或时间窗口缩小范围 → 定位根本原因。

5. 常见问题与总结

  • 重启后日志没了:默认 Storage=auto,系统不一定持久化。改 Storage=persistentmkdir /var/log/journal
  • 日志文件太大撑爆 /var:设置 SystemMaxUse=2G,配合 journalctl --vacuum-size=1G 手动清理。
  • 非 root 看不了日志:把用户加入 systemd-journal 组:usermod -aG systemd-journal 用户名
  • journalctl 查不到某服务的日志:确认该服务是否用 systemd 管理(systemctl list-units | grep 服务名),非 systemd 服务需要自行配置 journal 转发。

一句话:journalctl -u 服务名 -b -p err,这是麒麟系统排障的入口三板斧。


💡 写在最后:日志排障是麒麟运维的核心能力。专栏《银河麒麟操作系统最佳实践》里还有「systemd 服务化部署与故障自愈」「OOM 排查与内核参数调优」「等保日志审计配置」等来自金融生产环境的实操记录。👉 [点此查看专栏目录]

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐