journalctl 基础教程
- uvim管理员
journalctl是 Linux 中用于查看和管理systemd-journald服务日志的核心命令行工具。它可以帮助你快速检索系统、服务及内核的运行日志。核心基础命令
* 查看所有日志:
journalctl(默认进入
less翻页模式:方向键上下滚动,Space翻页,q退出,/搜字符串)
* 实时查看最新日志(类似tail -f):journalctl -f* 显示最新 $N$ 行日志:
journalctl -n 20* 反向显示(从最新日志开始):
journalctl -r按条件筛选日志
* 按指定服务/单元筛选:
journalctl -u nginx.service* 按时间范围筛选:
# 查找自指定时间以来的日志 journalctl --since "2026-09-08 00:00:00" # 查找时间段 journalctl --since "1 hour ago" --until "now" journalctl --since yesterday* 按日志级别筛选(0-7:Emerg 到 Debug):
# 只看错误(Error)及更严重级别(Emerg, Alert, Crit, Err) journalctl -p err* 按进程 ID (PID) 或系统内核筛选:
# 查看 PID 为 1234 的日志 journalctl _PID=1234 # 查看内核日志(类似 dmesg) journalctl -k系统与空间管理
* 查看本次开机后的所有日志:
journalctl -b* 查看上一次开机(前一趟运行)的日志:
journalctl -b -1* 检查日志占用占用的磁盘空间:
journalctl --disk-usage* 清理历史日志:
# 保留最近 500MB 的日志,清理其余部分 sudo journalctl --vacuum-size=500M # 只保留最近 7 天的日志 sudo journalctl --vacuum-time=7d实用小技巧
* 格式化输出(例如输出 JSON 格式供分析):
journalctl -u nginx.service -o json-pretty* 精炼输出(隐藏主机名和无用字段):
journalctl -u nginx.service -o cat journalctl的进阶用法侧重于多条件组合过滤、系统诊断分析、日志持久化配置,以及结合 JSON 与管道工具进行自动化日志解析。多条件高级组合筛选
journalctl支持通过逻辑与(空格分隔)和逻辑或(+分割)自由组合多个匹配参数。1. 逻辑与(同时满足多个条件)
# 筛选 nginx 服务中,日志级别为 error 及以上,且发生在今天的日志 journalctl -u nginx.service -p err --since today2. 逻辑或(满足任意一个条件)
# 同时查看 sshd 服务和 nginx 服务的日志 journalctl -u sshd.service + -u nginx.service3. 匹配特定元数据字段
systemd-journald为每条日志都标记了结构化的元数据属性:# 按特定可执行文件路径筛选 journalctl /usr/sbin/sshd # 按特定用户 UID 筛选(例如 UID 1000) journalctl _UID=1000 # 查看指定崩溃或事件关联的 cgroup 日志 journalctl _SYSTEMD_CGROUP=/system.slice/docker.service验证技巧:运行
journalctl -o json-pretty -n 1,可以查看单条日志包含的所有可筛选元数据字段(如_PID、_SYSTEMD_UNIT、_COMM等)。系统故障排查与诊断
1. 跨次开机(Boot ID)追踪
定位死机重启或系统崩溃前的异常:
# 列出历史记录中的所有开机记录(带有编号和 Boot ID) journalctl --list-boots # 查看倒数第二次开机(即上上次启动)期间的所有日志 journalctl -b -2 # 结合特定开机 ID 和优先级诊断故障 journalctl -b -1 -p err2. 内核及硬件诊断
# 查看内核日志并仅显示警告/错误(排查驱动或硬件故障) journalctl -k -p warning # 查看特定的设备路径日志(如 /dev/sda) journalctl /dev/sda结构化输出与管道处理
journalctl的-o/--output参数支持多种格式输出,便于配合jq、grep或awk分析。# 输出为 JSON 格式并使用 jq 提取特定字段(如消息本文与时间) journalctl -u sshd.service -o json | jq '{time: .__REALTIME_TIMESTAMP, msg: .MESSAGE}' # 输出简易格式(隐藏主机名和系统进程名,适合管道处理) journalctl -u nginx.service -o cat常见的
-o输出选项包括:short-iso:时间戳格式化为标准的 ISO 8601。json-pretty:美化排版的 JSON,适合审查元数据结构。verbose:展开显示每条日志的全部属性。
日志持久化与存储优化
默认情况下,部分 Linux 发行版的日志仅保存在内存内存(
/run/log/journal/)中,重启后会丢失。1. 启用永久存储
修改配置文件
/etc/systemd/journald.conf:[Journal] # 将 Storage 设置为 persistent 开启硬盘持久化保存 Storage=persistent # 限制日志最大占用的磁盘空间 SystemMaxUse=2G # 单个日志文件的最大容量 SystemMaxFileSize=200M # 最长保留时间 MaxRetentionSec=1month修改后保存并重启服务生效:
sudo systemctl restart systemd-journald2. 日志完整性校验(防篡改验证)
如果开启了 FSS(Forward Secure Sealing)安全特性,可以验证日志文件是否遭到了非授权改动或篡改:
journalctl --verify验证成功后会返回
PASS以及针对各日志文件的校验状态。Q: sudo journalctl -u ssh -n 20 --no-pager
这个命令太长了,我希望配置别名且支持 -n 传递指定数量
为了支持动态传递参数(例如
-n 20中的数字),不能直接使用标准的alias,因为 standard bash alias 不支持把参数插到命令中间。最简单且标准的解决方法是定义一个 Shell 函数(Function),然后将其配置到 Shell 的配置文件中。
方式一:定义为 Shell 函数(推荐)
将以下代码写入你的配置文件(如果是 Bash 写入
~/.bashrc;如果是 Zsh 写入~/.zshrc):# SSH 日志查询函数 jssh() { sudo journalctl -u ssh -n "${1:-20}" --no-pager "${@:2}" }函数逻辑解析:
${1:-20}:读取传入的第一个参数。如果没传参数,默认显示 20 条。${@:2}:允许传入额外的参数(例如添加-f进行实时追踪)。
配置生效:
修改完成后,执行
source ~/.bashrc(或source ~/.zshrc)使其生效。使用示例:
1. 默认查看 20 条日志:
jssh验证:终端输出 SSH 服务的最后 20 行日志。
2. 查看指定数量(如 50 条):
jssh 50验证:终端输出 SSH 服务的最后 50 行日志。
3. 搭配其他参数(如实时追踪最后 10 条):
jssh 10 -f验证:显示最后 10 条日志并保持实时刷新的 stream 状态。
方式二:免 sudo 优化(可选)
如果你不想每次执行时输入
sudo密码,可以把当前用户加入systemd-journal组:sudo usermod -aG systemd-journal $USER*执行后需重新登录或开启新终端生效。生效后可直接去掉函数中的
sudo。*