好的,这是一份详细的 journalctl 使用教程。
journalctl 是 systemd 日志系统(systemd-journald)的命令行查询工具。在所有现代 Linux 发行版(如 Ubuntu 16.04+, CentOS/RHEL 7+, Debian 8+)上,systemd 是默认的 init 系统,journalctl 也因此成为了查看和管理系统日志的标准方式。
它取代了(或统一了)旧的 /var/log/syslog, /var/log/messages, /var/log/dmesg 等零散的日志文件。
journalctl?
systemd 管理的服务(包括 Nginx, SSHd, Docker 等)、系统消息、内核日志 (dmesg) 都会自动汇集到 journald。follow)所有日志或特定服务的日志。
默认情况下,journalctl 会按时间顺序显示所有日志,并自动通过 less 分页器显示(所以你可以用箭头键上下滚动,按 q 退出)。
1journalctl
提示: 在 less 中,按 G (大写) 可立即跳到日志末尾(最新),按 g (小写) 跳到开头。
这是最常用的命令之一,等同于 tail -f。
21journalctl -f2# (按 Ctrl+C 停止)
使用 -n 标志可以指定显示最新的 N 行。
51# 显示最新的 20 行日志2journalctl -n 2034# 实时跟踪最新的 100 行5journalctl -n 100 -f
默认是时间正序(旧 -> 新)。使用 -r (--reverse) 可以反转,让最新日志显示在最上面。这对于快速查看“刚刚发生了什么”非常有用。
21journalctl -r2# (你会看到最新的日志在第一行,按 q 退出)
使用 -b (--boot) 标志,可以只显示本次系统启动以来的所有日志,自动过滤掉以前的旧日志。
11journalctl -b
这对于排查导致系统崩溃或重启的问题至关重要。
51# -b -1 指上一次启动2journalctl -b -134# -b -2 指上上次启动5journalctl -b -2你可以使用 journalctl --list-boots 查看所有可用的启动历史记录。
journalctl 真正的威力在于其过滤能力。
这是最重要的过滤方式,用于查看特定服务(如 nginx 或 sshd)的日志。
111# 查看 nginx 服务的所有日志2journalctl -u nginx.service34# 缩写 (通常 .service 可以省略)5journalctl -u nginx67# 实时跟踪 sshd 服务的日志8journalctl -u sshd -f910# 查看 docker 和 nginx 两个服务的日志11journalctl -u nginx -u docker
journalctl 可以理解人类可读的时间短语。
--since:从...开始--until:到...为止
111# 查看 1 小时前至今的所有日志2journalctl --since "1 hour ago"34# 查看 10 分钟前至今的 sshd 日志5journalctl -u sshd --since "10 min ago"67# 查看昨天的所有日志8journalctl --since "yesterday" --until "today"910# 查看特定时间范围内的日志11journalctl --since "2025-10-28 09:00:00" --until "2025-10-28 09:30:00"
用于快速筛选出错误或警告信息。优先级从高到低:
emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7)
使用 -p 标志。
111# 只显示错误(err)及以上级别的日志 (即 err, crit, alert, emerg)2journalctl -p err34# 也可以使用数字5journalctl -p 367# 查看本次启动以来的所有错误8journalctl -p err -b910# 查看 nginx 服务的所有警告(warning)及以上级别日志11journalctl -u nginx -p warning
这等同于运行 dmesg 命令。
31journalctl -k2# 或3journalctl --dmesg
有时你不知道服务名,只知道进程 ID 或可执行文件路径。
81# 按进程 ID2journalctl _PID=123434# 按用户 ID5journalctl _UID=100067# 按可执行文件路径8journalctl /usr/sbin/nginx
-o)
journald 存储的是结构化数据,你可以改变它的输出格式。
short:(默认) 经典的 syslog 格式。short-precise:带微秒级时间戳的 short 格式。verbose:显示日志的所有字段,包括 PID、UID、GID 等(信息量极大)。json:单行 JSON 格式。json-pretty:格式化(易读)的 JSON 格式,非常适合调试或管道给 jq。
51# 以高精度时间戳显示2journalctl -o short-precise34# 以易读的 JSON 格式显示 nginx 的最后 5 条日志5journalctl -u nginx -n 5 -o json-pretty
默认情况下,很多 systemd 发行版(如早期的 Ubuntu)将日志存储在 /run/log/journal/ 目录。run 目录是一个内存文件系统 (tmpfs),这意味着系统重启后所有日志都会丢失。
检查持久化状态:
31journalctl --disk-usage2# 如果看到 "Archived and active journals" 类似字样,说明是持久化的。3# 如果只看到 "Active" 并且路径在 /run/ 下,说明是易失的。如何启用持久化:
你只需创建 journald 默认的持久化存储目录即可。
61# 1. 创建目录2sudo mkdir -p /var/log/journal34# 2. 重启 journald 服务使其生效5sudo systemctl restart systemd-journald6# (或者直接重启服务器 sudo reboot)重启服务后,journald 会自动开始将日志写入 /var/log/journal/,重启后日志将保留。
11journalctl --disk-usage
如果日志占用了太多空间,可以手动清理。journald 也可以自动管理大小,但手动清理更直接。
清理方式 1:按大小限制(推荐)
这会删除最旧的日志,直到日志总大小小于指定值。
51# 清理旧日志,使总占用空间保留在 1GB2sudo journalctl --vacuum-size=1G34# 保留 100MB5sudo journalctl --vacuum-size=100M清理方式 2:按时间限制
这会删除指定时间之前的所有日志。
51# 清理旧日志,只保留最近 7 天的2sudo journalctl --vacuum-time=7d34# 只保留最近 1 小时的5sudo journalctl --vacuum-time=1h
你可以编辑配置文件 /etc/systemd/journald.conf 来永久限制日志大小。
101# 1. 编辑配置文件2sudo vim /etc/systemd/journald.conf34# 2. 找到并取消注释 (去掉 #) 以下行,并修改值5[Journal]6SystemMaxUse=1G7# RuntimeMaxUse=100M (这是 /run 目录的大小限制)89# 3. 重启服务使其生效10sudo systemctl restart systemd-journaldSystemMaxUse 是 /var/log/journal (持久化) 的大小上限。
journalctl 快速备忘录
| 命令 | 功能 |
|---|---|
journalctl -f | 实时跟踪(tail -f) |
journalctl -u nginx | 查看 nginx 服务的日志 |
journalctl -u nginx -f | 实时跟踪 nginx 的日志 |
journalctl -b | 查看本次启动的日志 |
journalctl -b -1 | 查看上一次启动的日志(用于排错) |
journalctl -r | 倒序显示(最新在前) |
journalctl -p err | 查看错误 (err) 及以上级别日志 |
journalctl -p err -b | 查看本次启动的所有错误 |
journalctl --since "1h ago" | 查看 1 小时前至今的日志 |
journalctl -k | 查看内核日志(dmesg) |
journalctl --disk-usage | 查看日志占用的磁盘空间 |
sudo journalctl --vacuum-size=1G | 清理日志,保留 1G |
sudo journalctl --vacuum-time=7d | 清理日志,保留 7 天 |