Linux journalctl命令详解
journalctl是systemd系统中用于查询和显示systemd日志(journald)的命令。与传统的syslog不同,journald以二进制格式存储日志,提供了更强大的查询和过滤功能。
一、基本概念
journald vs syslog
- 存储格式:二进制 vs 纯文本
- 索引:内置索引,查询更快
- 结构化:日志包含元数据(PID、UID、服务名等)
- 持久化:可配置持久化或临时存储
- 集成:与systemd深度集成
日志存储位置
- /var/log/journal/:持久化日志
- /run/log/journal/:临时日志(重启后丢失)
二、基本语法
journalctl [选项] [匹配条件]
三、常用选项
基础选项
- -n, –lines=N:显示最后N行(默认10行)
- -f, –follow:实时跟踪日志(类似tail -f)
- -r, –reverse:反向显示(最新的在前)
- -e, –pager-end:立即跳到日志末尾
- -k, –dmesg:仅显示内核消息
- -b, –boot[=ID]:显示特定启动的日志
- -u, –unit=UNIT:显示特定服务单元的日志
- -p, –priority=LEVEL:按优先级过滤
输出格式
- -o, –output=FORMAT:指定输出格式
- short:默认格式
- short-iso:ISO 8601时间戳
- short-precise:微秒精度
- json:JSON格式
- json-pretty:格式化的JSON
- verbose:显示所有字段
- cat:只显示消息正文
时间范围
- –since=TIME:显示此时间之后的日志
- –until=TIME:显示此时间之前的日志
日志级别(0-7)
- 0 emerg:系统不可用
- 1 alert:必须立即采取行动
- 2 crit:临界条件
- 3 err:错误
- 4 warning:警告
- 5 notice:注意
- 6 info:信息
- 7 debug:调试
四、实际案例
案例1:查看系统启动日志
# 查看当前启动的日志
journalctl -b
# 查看上一次启动的日志
journalctl -b -1
# 查看倒数第二次启动的日志
journalctl -b -2
# 列出所有启动记录
journalctl –list-boots
输出示例:
-2 3c5d7f8… Mon 2026-02-10 08:15:23 CST—Mon 2026-02-10 18:30:45 CST
-1 4d6e8f9… Tue 2026-02-14 09:00:12 CST—Tue 2026-02-14 23:45:30 CST
0 5e7f9fa… Sat 2026-02-15 08:30:00 CST—Sat 2026-02-15 14:25:18 CST
案例2:查看特定服务的日志
# 查看nginx服务日志
journalctl -u nginx
# 查看nginx最新50行日志
journalctl -u nginx -n 50
# 实时跟踪nginx日志
journalctl -u nginx -f
# 查看nginx今天的日志
journalctl -u nginx –since today
# 查看多个服务
journalctl -u nginx -u mysql
输出示例:
Feb 15 10:30:15 webserver nginx[1234]: 2026/02/15 10:30:15 [notice] 1234#1234: signal process started
Feb 15 10:30:16 webserver nginx[1234]: 192.168.1.100 – – [15/Feb/2026:10:30:16 +0800] "GET / HTTP/1.1" 200
Feb 15 10:30:20 webserver nginx[1234]: 192.168.1.101 – – [15/Feb/2026:10:30:20 +0800] "POST /api HTTP/1.1" 500
案例3:按时间范围查询
# 查看最近1小时的日志
journalctl –since "1 hour ago"
# 查看最近30分钟的日志
journalctl –since "30 min ago"
# 查看今天的日志
journalctl –since today
# 查看昨天的日志
journalctl –since yesterday –until today
# 查看指定时间段
journalctl –since "2026-02-15 09:00:00" –until "2026-02-15 10:00:00"
# 查看从某个时间点到现在
journalctl –since "2026-02-15 08:00:00"
# 相对时间格式
journalctl –since "2 days ago"
journalctl –since "1 week ago"
案例4:按日志级别过滤
# 只显示错误及以上级别(0-3)
journalctl -p err
# 显示警告及以上级别(0-4)
journalctl -p warning
# 指定具体级别
journalctl -p 3 # 只显示错误
# 指定级别范围
journalctl -p err..warning # 错误和警告
# 查看某服务的错误
journalctl -u apache2 -p err –since today
输出示例:
Feb 15 11:20:30 server systemd[1]: Failed to start MySQL Community Server.
Feb 15 11:20:30 server systemd[1]: mysql.service: Unit entered failed state.
Feb 15 11:25:45 server kernel: Out of memory: Kill process 5678 (java) score 920
案例5:按进程ID查询
# 查看特定PID的日志
journalctl _PID=1234
# 查看某进程的所有日志
journalctl $(which sshd)
# 查看当前shell的日志
journalctl _PID=$$
案例6:内核消息
# 查看所有内核消息(等同于dmesg)
journalctl -k
# 查看当前启动的内核消息
journalctl -k -b
# 查看内核错误
journalctl -k -p err
# 实时监控内核消息
journalctl -k -f
输出示例:
Feb 15 08:30:01 server kernel: Linux version 5.15.0-91-generic
Feb 15 08:30:01 server kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-91
Feb 15 10:45:32 server kernel: usb 2-1: new high-speed USB device number 5
Feb 15 11:20:15 server kernel: sd 0:0:0:0: [sda] Sense Key : Medium Error
案例7:按用户过滤
# 查看特定用户的日志
journalctl _UID=1000
# 查看root用户的日志
journalctl _UID=0
# 查看某用户组的日志
journalctl _GID=1000
# 结合用户名查看
journalctl _UID=$(id -u username)
案例8:磁盘空间管理
# 查看日志占用空间
journalctl –disk-usage
# 清理日志,只保留最近2天
journalctl –vacuum-time=2d
# 限制日志总大小为500M
journalctl –vacuum-size=500M
# 只保留最近100个日志文件
journalctl –vacuum-files=100
# 验证日志完整性
journalctl –verify
输出示例:
Archived and active journals take up 1.5G in the file system.
Deleted archived journal /var/log/journal/…/system@xxx.journal (56.0M).
Deleted archived journal /var/log/journal/…/user-1000@xxx.journal (23.5M).
Vacuuming done, freed 79.5M of archived journals from /var/log/journal/…
案例9:高级过滤和组合
# 多条件组合:nginx错误且在最近1小时
journalctl -u nginx -p err –since "1 hour ago"
# 排除某些单元
journalctl -u nginx -u apache2 –since today
# 使用通配符
journalctl -u 'systemd-*'
# 查看特定字段
journalctl SYSLOG_IDENTIFIER=sshd
# 自定义输出(只显示时间和消息)
journalctl -o short-precise -n 100 | awk '{print $1, $2, $3, $NF}'
案例10:故障排查实例
场景1:服务启动失败
# 查看服务启动失败的详细信息
journalctl -xeu nginx.service
# -x: 显示额外的说明信息
# -e: 跳到日志末尾
# -u: 指定服务单元
输出示例:
Feb 15 12:00:15 server systemd[1]: Starting A high performance web server…
— Subject: Unit nginx.service has begun start-up
— Defined-By: systemd
— Support: http://www.ubuntu.com/support
—
— Unit nginx.service has begun starting up.
Feb 15 12:00:15 server nginx[5678]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Feb 15 12:00:15 server systemd[1]: nginx.service: Control process exited, code=exited status=1
Feb 15 12:00:15 server systemd[1]: nginx.service: Failed with result 'exit-code'.
Feb 15 12:00:15 server systemd[1]: Failed to start A high performance web server.
— Subject: Unit nginx.service has failed
场景2:系统性能问题
# 查看最近的OOM事件
journalctl -p warning –since "24 hours ago" | grep -i "out of memory"
# 查看CPU/内存相关告警
journalctl -p warning –since today | grep -E "CPU|memory|load"
# 查看磁盘I/O错误
journalctl -k -p err | grep -E "sd|nvme|I/O"
场景3:安全审计
# 查看SSH登录记录
journalctl -u sshd –since today | grep "Accepted\\|Failed"
# 查看sudo使用记录
journalctl | grep sudo | grep COMMAND
# 查看用户切换记录
journalctl | grep "session opened\\|session closed"
# 查看认证失败
journalctl _SYSTEMD_UNIT=sshd.service -p warning –since today
输出示例:
Feb 15 09:15:23 server sshd[1234]: Failed password for root from 192.168.1.100 port 54321 ssh2
Feb 15 09:15:28 server sshd[1234]: Failed password for root from 192.168.1.100 port 54321 ssh2
Feb 15 09:20:45 server sshd[2345]: Accepted publickey for admin from 192.168.1.200 port 12345 ssh2
Feb 15 10:30:12 server sudo[3456]: admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ; COMMAND=/bin/systemctl restart nginx
案例11:导出和分析
# 导出为JSON格式便于分析
journalctl -u nginx –since today -o json > nginx_logs.json
# 导出为JSON-Pretty格式(可读性更好)
journalctl -u nginx -n 100 -o json-pretty > nginx_logs_pretty.json
# 导出特定时间段的所有日志
journalctl –since "2026-02-15 00:00:00" –until "2026-02-15 23:59:59" > daily_logs.txt
# 使用jq处理JSON日志
journalctl -u nginx -o json –since today | jq -r 'select(.MESSAGE | contains("error")) | .MESSAGE'
案例12:实时监控面板
# 实时监控所有错误
journalctl -f -p err
# 实时监控特定服务的所有日志
journalctl -u nginx -f –output=short-precise
# 实时监控多个服务
journalctl -f -u nginx -u mysql -u redis
# 彩色实时监控(带级别标识)
journalctl -f –output=short-iso-precise -p info
五、配置文件
/etc/systemd/journald.conf
# 编辑配置文件
sudo vim /etc/systemd/journald.conf
关键配置项:
[Journal]
# 存储模式:persistent(持久化), volatile(临时), auto(自动)
Storage=persistent
# 日志压缩
Compress=yes
# 最大日志大小
SystemMaxUse=1G # 所有日志文件总大小上限
SystemKeepFree=500M # 至少保留的磁盘空间
SystemMaxFileSize=100M # 单个日志文件大小上限
# 日志保留时间
MaxRetentionSec=1month
# 转发到syslog
ForwardToSyslog=yes
ForwardToWall=no
# 日志同步间隔
SyncIntervalSec=5m
# 日志分割
#RateLimitIntervalSec=30s
#RateLimitBurst=1000
重启服务使配置生效:
sudo systemctl restart systemd-journald
六、高级技巧
1. 创建自定义日志过滤脚本
#!/bin/bash
# 文件名:journal-monitor.sh
# 监控关键服务的错误
echo "=== 关键服务错误 ==="
journalctl -u nginx -u mysql -u redis -p err –since "1 hour ago" –no-pager
# 监控认证失败
echo -e "\\n=== SSH认证失败 ==="
journalctl -u sshd –since "1 hour ago" –no-pager | grep "Failed password"
# 监控系统资源告警
echo -e "\\n=== 系统资源告警 ==="
journalctl -p warning –since "1 hour ago" –no-pager | grep -E "memory|CPU|disk"
# 监控内核错误
echo -e "\\n=== 内核错误 ==="
journalctl -k -p err –since "1 hour ago" –no-pager
2. 日志分析统计
# 统计各服务的日志条数
journalctl –since today –no-pager | awk '{print $5}' | sort | uniq -c | sort -rn | head -20
# 统计错误最多的服务
journalctl -p err –since today –no-pager | grep -oP '(?<=\\[)\\d+(?=\\])' | sort | uniq -c | sort -rn
# 按小时统计日志量
journalctl –since today -o short-iso | awk '{print $1}' | cut -d'T' -f2 | cut -d':' -f1 | sort | uniq -c
3. 集成到监控系统
# 检查是否有critical级别的日志
if journalctl -p crit –since "5 min ago" –no-pager | grep -q .; then
echo "CRITICAL: 发现严重错误!"
journalctl -p crit –since "5 min ago" –no-pager | mail -s "系统告警" admin@example.com
fi
4. 日志轮转策略
# 每周清理一次,只保留最近7天
cat > /etc/cron.weekly/journal-cleanup <<'EOF'
#!/bin/bash
journalctl –vacuum-time=7d
journalctl –verify
EOF
chmod +x /etc/cron.weekly/journal-cleanup
七、常用组合命令
# 查看系统启动耗时分析
systemd-analyze blame
# 配合journalctl查看慢启动服务的日志
systemd-analyze blame | head -5 | awk '{print $2}' | xargs -I {} journalctl -u {} -b
# 查看服务依赖关系
systemctl list-dependencies nginx.service
# 查看服务状态和最近日志
systemctl status nginx -l –no-pager
# 持续监控系统状态
watch -n 1 'journalctl -p err –since "1 min ago" –no-pager | tail -20'
八、注意事项
九、与其他工具对比
| 存储格式 | 二进制 | 文本 | 内存环形缓冲区 |
| 索引速度 | 快 | 慢 | 快 |
| 结构化查询 | 强 | 弱 | 弱 |
| 持久化 | 可配置 | 是 | 否(需保存) |
| 日志范围 | 全系统 | 全系统 | 仅内核 |
journalctl是现代Linux系统日志管理的核心工具,掌握它能大大提高系统故障诊断和日志分析的效率。




