Linux之journalctl
journalctl 是 systemd 日志系统(journal)的查询工具,用于查看和分析系统日志。
一、基本查看命令
1. 查看所有日志
# 查看完整的系统日志
journalctl
# 实时查看最新日志
journalctl -f
journalctl --follow
# 查看指定行数的日志
journalctl -n 20 # 查看最后20行
journalctl --lines=50 # 查看最后50行
# 从末尾开始查看(类似tail -f)
journalctl -f -n 20 # 实时查看最后20行
2. 按时间筛选
# 查看今天的日志
journalctl --since today
journalctl --since "2024-01-01" # 从指定日期开始
journalctl --since "2024-01-01 00:00:00"
# 查看指定时间范围的日志
journalctl --since "09:00" --until "10:00"
journalctl --since "2 hours ago"
journalctl --since "1 hour ago" --until "now"
# 查看昨天的日志
journalctl --since yesterday --until today
journalctl --since "yesterday 09:00" --until "today 09:00"
3. 按优先级筛选
# 查看指定优先级的日志
journalctl -p err # 错误级别
journalctl -p error # 同 err
journalctl -p warning # 警告级别
journalctl -p info # 信息级别
journalctl -p debug # 调试级别
# 查看多个级别
journalctl -p err..warning # 从错误到警告
journalctl -p warning..debug # 从警告到调试
# 优先级列表(0-7):
# 0: emerg 紧急
# 1: alert 警报
# 2: crit 严重
# 3: err 错误
# 4: warning 警告
# 5: notice 通知
# 6: info 信息
# 7: debug 调试
二、按单元(服务)筛选
1. 查看特定服务的日志
# 查看指定服务的所有日志
journalctl -u sshd
journalctl --unit=nginx
journalctl -u docker.service
# 查看多个服务
journalctl -u sshd -u nginx
journalctl -u "sshd*" # 使用通配符
# 查看失败的服务
journalctl -u failed
2. 结合时间和单元
# 查看服务今天重启后的日志
journalctl -u nginx --since "09:00"
# 查看服务最后100行并实时监控
journalctl -u sshd -f -n 100
3. 查看系统启动相关日志
# 查看当前启动的日志
journalctl -b
journalctl --boot
# 查看指定启动的日志
journalctl -b -1 # 上次启动
journalctl -b -2 # 上上次启动
journalctl --list-boots # 列出所有启动记录
# 查看启动过程中的日志
journalctl -b -0 # 当前启动(默认)
journalctl -b -0 -p err # 当前启动的错误日志
三、高级筛选和过滤
1. 按进程、用户、组筛选
# 按PID筛选
journalctl _PID=1234
journalctl _PID=1234 _PID=5678 # 多个PID
# 按用户筛选
journalctl _UID=1000
journalctl _UID=$(id -u $USER) # 当前用户
# 按组筛选
journalctl _GID=100
# 按进程名筛选
journalctl /usr/sbin/sshd
2. 按设备、内核筛选
# 查看内核日志
journalctl -k
journalctl --dmesg
# 查看系统日志(排除内核)
journalctl -k --invert-match
# 按设备路径筛选
journalctl /dev/sda
journalctl /dev/sda1
3. 自定义字段筛选
# 查看所有可用的字段
journalctl -F _SYSTEMD_UNIT # 查看所有单元名
journalctl -F _COMM # 查看所有命令名
journalctl -F _EXE # 查看所有可执行路径
journalctl -F SYSLOG_IDENTIFIER # 查看所有标识符
# 使用字段筛选
journalctl _SYSTEMD_UNIT=sshd.service
journalctl _COMM=sshd
journalctl _EXE=/usr/sbin/sshd
journalctl SYSLOG_IDENTIFIER=kernel
四、搜索和模式匹配
1. 基本搜索
# 搜索包含关键词的日志
journalctl -g "error"
journalctl --grep="fail"
# 不区分大小写搜索
journalctl -g -i "ERROR" # -i 忽略大小写
journalctl --case-sensitive=false
# 反向搜索(不包含关键词)
journalctl -g -v "success" # -v 反向搜索
2. 正则表达式搜索
# 使用正则表达式
journalctl --grep="error|fail" # 匹配error或fail
journalctl --grep="^error:" # 以error:开头
journalctl --grep="failed$" # 以failed结尾
# 复杂的正则匹配
journalctl --grep="(err|error|fail).*code [0-9]+"
3. 组合搜索条件
# AND 逻辑(所有条件都满足)
journalctl -u sshd _COMM=sshd
journalctl --since "09:00" -p err
# 使用 + 号连接多个条件
journalctl + _SYSTEMD_UNIT=sshd.service + _PID=1234
五、输出格式控制
1. 输出格式选项
# 简短输出(默认)
journalctl -o short
# 完整输出(显示所有字段)
journalctl -o verbose
journalctl -o json # JSON格式
journalctl -o json-pretty # 格式化JSON
journalctl -o json-sse # JSON SSE格式
journalctl -o cat # 只显示消息
journalctl -o export # 二进制格式(用于传输)
journalctl -o short-iso # 简短ISO时间格式
journalctl -o short-precise # 精确时间格式
journalctl -o short-monotonic # 单调时钟格式
journalctl -o short-unix # UNIX时间戳格式
2. 自定义输出字段
# 使用--output-fields指定字段
journalctl -o json --output-fields=MESSAGE,_PID,_SYSTEMD_UNIT
# 显示特定字段
journalctl -o verbose --no-pager | grep -E "(MESSAGE|_PID|_SYSTEMD_UNIT)"
六、分页和导出
1. 分页控制
# 不使用分页器(直接输出)
journalctl --no-pager
journalctl --no-pager -n 100
# 指定分页器
journalctl --pager=less
journalctl --pager=cat > output.txt
# 禁用分页和颜色
journalctl --no-pager --no-full
2. 导出日志
# 导出到文件
journalctl --since "2024-01-01" > journal.log
journalctl -o json > journal.json
# 导出特定服务
journalctl -u nginx --since "yesterday" > nginx.log
# 压缩导出
journalctl --since "1 month ago" | gzip > journal.gz
3. 日志轮转和清理
# 查看日志磁盘使用情况
journalctl --disk-usage
journalctl --vacuum-size=500M # 清理到指定大小
journalctl --vacuum-time=2weeks # 清理指定时间前的日志
journalctl --vacuum-files=5 # 保留指定数量的日志文件
# 立即清理
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s
七、调试和分析
1. 系统问题诊断
# 查看系统启动问题
journalctl -b -0 -p err..crit # 当前启动的错误和严重问题
journalctl -b -0 --grep="fail" # 启动失败相关
journalctl -b -0 _SYSTEMD_UNIT=systemd-modules-load.service
# 查看内核模块加载
journalctl -k --grep="module"
2. 服务故障排查
# 查看服务启动失败
journalctl -u failed --no-pager
journalctl -xeu nginx.service # -x 额外解释,-e 跳到最后
# 查看服务的完整生命周期
journalctl -u docker --since "yesterday" --until "now"
3. 性能分析
# 查看耗时长的服务启动
journalctl -u nginx --since "09:00" -o verbose | grep -E "(DURATION|TIME)"
journalctl --since "1 hour ago" -o json | jq 'select(._SOURCE_REALTIME_TIMESTAMP)'
# 统计错误频率
journalctl -p err --since "today" | grep -o "[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}" | sort | uniq -c
八、实时监控
1. 实时监控特定服务
# 监控SSH登录
journalctl -f -u sshd --grep="Accepted\|Failed"
# 监控系统错误
journalctl -f -p err..warning
# 监控特定进程
journalctl -f _PID=$(pgrep nginx)
# 监控用户登录
journalctl -f _COMM=login
journalctl -f SYSLOG_IDENTIFIER=systemd-logind
2. 实时监控系统事件
# 监控硬件事件
journalctl -f /dev/sda
journalctl -f -k # 监控内核消息
# 监控网络连接
journalctl -f --grep="network\|NetworkManager"
九、组合命令和脚本
1. 常用组合命令
# 查看今天所有错误并按服务分组
journalctl --since today -p err --no-pager | grep "_SYSTEMD_UNIT" | sort | uniq -c | sort -rn
# 生成错误报告
journalctl --since "1 week ago" -p err..alert -o short-iso > error_report.txt
# 查看服务重启历史
journalctl -u nginx --grep="Starting\|Stopping" --since "1 month ago"
2. 实用脚本
#!/bin/bash
# journal-analyze.sh - 日志分析脚本
# 分析指定时间的错误
analyze_errors() {
echo "=== 错误日志分析 ($1) ==="
journalctl --since "$1" -p err --no-pager | \
awk '/_SYSTEMD_UNIT/ {unit=$NF} /MESSAGE=/ {print unit ": " $0}' | \
sort | uniq -c | sort -rn
}
# 监控服务状态变化
monitor_service() {
echo "监控服务: $1"
journalctl -u "$1" -f --since "now" -o cat | \
while read line; do
echo "[$(date '+%H:%M:%S')] $line"
done
}
# 使用示例
analyze_errors "yesterday"
# monitor_service "nginx"
十、系统维护
1. 日志维护命令
# 手动触发日志轮转
sudo journalctl --rotate
# 立即写入磁盘
sudo journalctl --flush
# 重建日志索引(损坏时)
sudo journalctl --rebuild-failed
sudo systemctl restart systemd-journald
# 设置日志限制
# 编辑 /etc/systemd/journald.conf
sudo nano /etc/systemd/journald.conf
# 常用配置:
# SystemMaxUse=500M # 最大磁盘使用
# SystemKeepFree=1G # 保留空间
# SystemMaxFileSize=100M # 单个文件最大
# MaxRetentionSec=1month # 保留时间
2. 远程日志查看
# 启用远程日志(需配置journald.conf)
# 在/etc/systemd/journald.conf中设置:
# ForwardToSyslog=yes
# Remote=yes
# 使用SSH查看远程日志
ssh user@remote-host "journalctl -u nginx --since '1 hour ago'"
# 使用systemd-journal-remote
sudo systemctl start systemd-journal-remote
十一、特殊用例
1. 容器日志查看
# 查看Docker容器日志(通过systemd)
journalctl -u docker CONTAINER_NAME=mycontainer
# 查看Podman容器
journalctl CONTAINER_NAME=mycontainer
2. 安全审计
# 查看用户认证日志
journalctl SYSLOG_IDENTIFIER=sshd --grep="password\|authentication"
journalctl _COMM=login
# 查看sudo使用
journalctl _COMM=sudo
# 查看文件访问
journalctl --grep="open\|read\|write" _COMM=cat
3. 硬件故障排查
# 查看硬件错误
journalctl -k --grep="error\|fail\|hardware"
journalctl /dev/sda --grep="error"
# 查看USB设备
journalctl -k --grep="usb"
journalctl --grep="USB"
十二、快捷键和交互操作
在journalctl分页器中可以使用以下快捷键:
| 快捷键 | 功能 |
|---|---|
Space |
向下翻页 |
b |
向上翻页 |
g |
跳到开头 |
G |
跳到最后 |
/ |
搜索 |
n |
下一个匹配项 |
N |
上一个匹配项 |
q |
退出 |
F |
跟踪模式(类似tail -f) |
Ctrl+C |
退出跟踪模式 |
十三、常见问题解决
1. 日志文件损坏
# 检查日志完整性
sudo journalctl --verify
# 修复损坏的日志
sudo journalctl --sync
sudo systemctl restart systemd-journald
# 如果严重损坏
sudo rm -rf /var/log/journal/*
sudo systemctl restart systemd-journald
2. 磁盘空间不足
# 查看日志占用
sudo journalctl --disk-usage
# 清理旧日志
sudo journalctl --vacuum-size=200M
sudo journalctl --vacuum-time=2weeks
# 永久限制大小
sudo nano /etc/systemd/journald.conf
# 设置: SystemMaxUse=500M
3. 权限问题
# 普通用户无法查看某些日志
sudo journalctl -u nginx
# 查看用户自己的日志
journalctl _UID=$(id -u)
# 添加用户到systemd-journal组
sudo usermod -aG systemd-journal $USER
快速参考表
| 场景 | 命令 |
|---|---|
| 基本查看 | journalctl |
| 实时跟踪 | journalctl -f |
| 查看错误 | journalctl -p err |
| 按服务查看 | journalctl -u nginx |
| 按时间查看 | journalctl --since "09:00" |
| 查看今天日志 | journalctl --since today |
| 查看启动日志 | journalctl -b |
| 查看上次启动 | journalctl -b -1 |
| 查看内核日志 | journalctl -k |
| 搜索关键词 | journalctl -g "error" |
| JSON输出 | journalctl -o json |
| 清理日志 | journalctl --vacuum-size=500M |
| 查看磁盘使用 | journalctl --disk-usage |
| 查看最后N行 | journalctl -n 50 |
最佳实践
- 使用时间范围:始终使用
--since和--until缩小范围 - 按优先级过滤:使用
-p参数只看需要的级别 - 结合grep:复杂搜索使用
--grep而非管道到grep - 实时监控:使用
-f监控服务启动或故障 - 定期清理:配置自动清理策略防止磁盘占满
- 保存重要日志:重要事件导出备份
- 学习字段过滤:使用字段过滤比文本搜索更高效
- 使用反向搜索:排除无关信息时使用
-v参数
浙公网安备 33010602011771号