journalctl命令以及参数详解

概述

journalctl 是 Linux 系统(基于 systemd)中用于查询和显示 系统日志 的核心工具。它读取的是 systemd-journald 服务维护的二进制日志文件。

相比传统的 cat /var/log/messagestail -fjournalctl 更加强大,因为它支持按时间、按服务、按启动次序、按日志级别等多种维度的结构化查询。

一、 基础参数与常用选项

参数 简写 含义 详细说明
--unit -u 指定服务 最常用。只查看特定服务的日志,如 -u kubelet。
--follow -f 实时追踪 类似于 tail -f,实时输出最新的日志。
--lines -n 指定行数 显示最近的 N 行。默认为 10 行。如 -n 100。
--boot -b 指定启动次序 查看某次启动后的日志。-b 是本次启动,-b -1 是上一次启动。
--dmesg -k 内核日志 只显示内核日志(类似 dmesg 命令),排查 OOM 或硬件故障专用。
--since 开始时间 指定查询的起始时间,支持 "1 hour ago", "2024-01-01" 等格式。
--until 结束时间 指定查询的结束时间。
--output -o 输出格式 调整显示格式,如 short (默认), json, cat (只看信息)。
--reverse -r 反向显示 最新的日志显示在最上面(默认是最新的在最下面)。
--no-pager 不分页 直接输出所有内容到屏幕,不通过 less 分页,适合脚本处理或输出极短时。
--priority -p 日志级别 过滤日志等级,如 err, warning, info。

二、 实战详解与场景演练

查看特定服务的日志 (K8s 排查必备)

这是运维中最常用的命令,只看关键组件的日志。

shell 复制代码
# 查看 kubelet 的日志
journalctl -u kubelet
# 查看 Docker 的日志
journalctl -u docker
# 实时查看 kubelet 的最新日志(类似 tail -f)
journalctl -u kubelet -f

按时间段过滤 (故障回溯)

当你知道故障发生的大致时间时,这招非常有用。

perl 复制代码
# 查看今天的所有日志
journalctl --since "today"
# 查看最近 1 小时的日志
journalctl --since "1 hour ago"
# 查看指定时间段的日志
journalctl --since "2023-10-24 10:00:00" --until "2023-10-24 11:00:00"

排查节点重启原因 (配合 -b)

如果你的服务器重启了,想看重启前那一刻 发生了什么,或者是上一次启动期间的日志。

bash 复制代码
# 查看当前启动后的日志 (等同于 uptime 之后的日志)
journalctl -b

# 查看"上一次"启动周期的日志 (即重启前的日志) ------ 排查 crash 的神器
journalctl -b -1# 查看"倒数第二次"启动周期的日志
journalctl -b -2

注意: 如果没有配置持久化存储日志(/var/log/journal 目录不存在),重启后历史日志可能会丢失。

只看错误级别的日志

通过日志级别过滤,屏蔽掉海量的 INFO 和 DEBUG 信息。

bash 复制代码
# 查看所有错误 (Error) 及以上级别的日志
journalctl -p err

# 查看某个服务的错误日志
journalctl -u kubelet -p err

级别代码: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7).

查看内核日志

当 K8s 节点出现 OOM (内存溢出) 或硬件报错时,日志通常在内核层。

bash 复制代码
journalctl -k
# 或者
journalctl --dmesg

配合 grep 查找 OOM :

perl 复制代码
journalctl -k | grep -i "killed"

格式化输出

默认情况下,如果日志单行太长,journalctl 可能会截断或需要左右滚动。

perl 复制代码
#不分页,直接打印所有内容(自动换行)
journalctl -u kubelet --no-pager

# 输出为 JSON 格式 (方便程序解析或导入 ELK)
journalctl -u kubelet -o json-pretty

# 直接在当前界面按右箭头键 →
journalctl -u kubelet

三、 日志容量管理 (清理磁盘空间)

systemd 日志默认存储在 /run/log/journal (内存,重启丢) 或 /var/log/journal (磁盘,持久化)。如果不加限制,可能会占满磁盘。

  1. 查看当前日志占用空间:
css 复制代码
journalctl --disk-usage
  1. 清理日志:
ini 复制代码
# 仅保留最近 1GB 的日志
journalctl --vacuum-size=1G

# 仅保留最近 2 天的日志
journalctl --vacuum-time=2d

四、 组合拳 (高级用法示例)

场景:K8s 节点刚刚因为负载过高 重启 了,我想看重启前 20 分钟内,kubelet 有没有报错。

命令组合:

  1. -b -1: 选择上一次启动周期(重启前)。
  2. -u kubelet: 只看 kubelet。
  3. -p err: 只看错误。
  4. --since: 如果能确定大概时间。
css 复制代码
# 简化版:看上一次启动期间 kubelet 的最后 500 行日志
journalctl -b -1 -u kubelet -n 500

# 进阶版:看上一次启动期间所有的系统错误和内核崩溃信息
journalctl -b -1 -p err -k

总结

日常运维排查,只要掌握以下这句即可应对大部分的场景:

arduino 复制代码
journalctl -u <服务名> -f -n 100 --since "1 hour ago"
相关推荐
AIex-YH2 小时前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
荒--2 小时前
MSF 使用
linux·运维·服务器
明航咨询-程老师2 小时前
信创运维困局:“救火队”模式走到尽头,平台工程如何重塑CISAW安全体系?
运维·安全·数据安全官,ccrc 认证,数据合规,职业发展规划
狮子再回头2 小时前
relhat9.1 sshd配置
linux·服务器·网络
w3296362713 小时前
八、OpenCode 高阶玩法:CLI 自动化、CI/CD 集成与远程协作
运维·ci/cd·自动化·ai编程·开发工具·opencode
烁3473 小时前
liunx命令不完整版
linux·运维·服务器
vsropy3 小时前
cmake版本不对不能直接删/无法source
linux·运维·服务器
xcLeigh3 小时前
鸿蒙平台 gThumb 图片查看器适配实战:从 Linux GTK 到 Electron 鸿蒙壳工程
linux·electron·harmonyos·gnome·桌面环境·gthumb
wuminyu3 小时前
Java世界中StringTable源码剖析
java·linux·c语言·jvm·c++
Esaka_Forever4 小时前
Zapier 云端无代码 AI 工作流编排自动化平台
运维·自动化