Linux上查看systemd journal日志的方法非常丰富,从基础查看 、筛选过滤 、指定文件查看三个维度总结相关内容:
📋 一、基础查看方法
1. 基本查看命令
bash
# 查看所有日志
sudo journalctl
# 实时查看新日志
sudo journalctl -f
# 查看本次启动后的日志
sudo journalctl -b
# 查看前一次启动的日志(需要持久化存储)sudo journalctl -b -1
# 查看导出的独立的.journal文件,--file选项,可一次性打开多个,多个文件中日志全部按照时间排序显示
journalctl --file user-1000.journal --file system.journal
2. 控制输出格式
bash
# 简短格式(默认)
sudo journalctl -n 10
# JSON格式(适合程序处理)
sudo journalctl -n 3 -o json
# JSON美化输出
sudo journalctl -n 3 -o json-pretty
# 详细输出(显示所有字段)
sudo journalctl -n 3 -o verbose
# 仅输出原始消息
sudo journalctl -n 3 -o cat
🎯 二、筛选过滤日志
1. 按时间筛选
bash
# 查看最近2小时的日志
sudo journalctl --since "2 hours ago"
# 查看指定时间范围的日志
sudo journalctl --since "2024-01-15 09:00:00" --until "2024-01-15 10:00:00"
# 查看今天日志
sudo journalctl --since today
# 查看昨天日志
sudo journalctl --since yesterday --until today
# 查看最近10分钟
sudo journalctl --since "-10min"
2. 按服务/单元筛选
bash
# 查看指定服务的日志
sudo journalctl -u nginx.service
# 查看多个服务的日志
sudo journalctl -u nginx.service -u mysql.service
# 查看所有失败的单元
sudo journalctl --failed
3. 按优先级筛选
bash
# 查看紧急错误(优先级数字0-3)
sudo journalctl -p err
# 查看警告及以上级别
sudo journalctl -p warning
# 查看特定级别
# 级别:emerg(0), alert(1), crit(2), err(3), warning(4), notice(5), info(6), debug(7)
sudo journalctl -p 0..3
4. 按字段内容筛选
bash
# 按进程ID筛选
sudo journalctl _PID=1234
# 按用户ID筛选
sudo journalctl _UID=1000
# 按可执行路径筛选
sudo journalctl _EXE=/usr/sbin/nginx
# 按命令行筛选
sudo journalctl _COMM=sshd
# 组合多个条件
sudo journalctl _UID=1000 _PID=1234
5. 按关键字/模式筛选
bash
# 查找包含关键字的日志
sudo journalctl -k
sudo journalctl | grep "error"
# 使用正则表达式
sudo journalctl -g "error|fail"
# 反向匹配(排除某些内容)
sudo journalctl -u sshd --grep="Failed" --invert-match
6. 按引导(Boot)筛选
bash
# 列出所有启动记录
sudo journalctl --list-boots
# 查看指定启动的日志(-0当前,-1上一次,-2上上次)
sudo journalctl -b -2
# 查看指定启动ID的日志
sudo journalctl -b 3a176f8c5d874c8a9e234b5c8d5e6f7a
📂 三、查看指定日志文件
1. 指定持久化日志文件
bash
# 查看特定机器ID的日志文件
sudo journalctl --file=/var/log/journal/<machine-id>/system.journal
# 查看用户日志文件
sudo journalctl --file=/var/log/journal/<machine-id>/user-1000.journal
# 查看所有持久化日志文件
sudo journalctl --directory=/var/log/journal/
# 查看特定目录下的所有日志
sudo journalctl --directory=/var/log/journal/<machine-id>/
2. 指定运行时日志文件
bash
# 查看运行时(内存)日志文件
sudo journalctl --file=/run/log/journal/<machine-id>/system.journal
# 合并查看多个日志文件
sudo journalctl --file=/var/log/journal/*/*.journal
3. 指定远程日志文件
bash
# 查看远程主机的日志文件(需要预先复制文件)
sudo journalctl --file=remote-system.journal
# 从备份中查看日志
sudo journalctl --file=/backup/journal/system.journal
🔧 四、高级组合查询
1. 组合查询示例
bash
# 查询nginx服务今天产生的错误日志
sudo journalctl -u nginx.service --since today -p err
# 查询指定时间段内特定进程的日志
sudo journalctl _PID=1234 --since "09:00" --until "10:00"
# 查看系统启动时内核相关错误
sudo journalctl -b -p err -k
# 查看指定用户产生的SSH登录失败
sudo journalctl _UID=1000 _COMM=sshd --grep="Failed"
2. 保存和导出日志
bash
# 保存日志到文件
sudo journalctl --since "2024-01-01" > journal-2024.log
# 导出为JSON格式
sudo journalctl --since "2024-01-01" -o json > journal-2024.json
# 仅导出特定字段
sudo journalctl -o json --output-fields=MESSAGE,PRIORITY,_PID > filtered.log
3. 日志分析和统计
bash
# 统计各优先级日志数量
sudo journalctl --since "1 hour ago" -o json | jq '._PID,.PRIORITY,.MESSAGE'
# 查看日志磁盘使用情况
sudo journalctl --disk-usage
# 查看日志文件信息
sudo journalctl --header
# 验证日志文件完整性
sudo journalctl --verify
💡 五、实用技巧和小贴士
1. 快速定位问题
bash
# 查看最新的50条错误
sudo journalctl -p err -n 50
# 追踪特定服务的实时日志
sudo journalctl -u docker.service -f
# 查看系统启动最耗时的服务
sudo journalctl -b | grep "Starting.*\.service" | tail -20
2. 配置相关查看
bash
# 查看journald服务自身的日志
sudo journalctl -u systemd-journald
# 查看配置变更
sudo journalctl -u systemd-journald --grep="config\|storage\|directory"
3. 特殊查询语法
bash
# +号表示"且"关系
sudo journalctl _UID=1000 + _PID=1234
# 使用OR操作
sudo journalctl '(_UID=1000 OR _UID=0)'
# 字段值包含特定字符串
sudo journalctl MESSAGE=*error*
4. 清理和管理日志
bash
# 清理旧的日志(保留最近2周)
sudo journalctl --vacuum-time=2weeks
# 清理日志到指定大小
sudo journalctl --vacuum-size=500M
# 手动轮转日志
sudo journalctl --rotate
📊 六、可视化工具(可选)
如果需要图形界面,可以考虑:
bash
# 方式1:
sudo apt install systemd-journal-remote
# 使用systemd-journal-gatewayd(Web界面)
sudo systemctl start systemd-journal-gatewayd
# 然后浏览器访问 http://localhost:19531
# 方式2:创建简单Web服务(端口8080)
python3 -m http.server 8080 --directory /var/log/journal/ &
# 注意:这需要适当的权限和安全配置
# 然后浏览器访问 http://localhost:8080
# 使用journalctl配合less查看
sudo journalctl --since "1 hour ago" | less -S
# 导出后用其他工具分析
sudo journalctl --since "2024-01-01" -o json > logs.json
# 然后用jq、Python pandas等工具分析
🚀 快速参考表
| 用途 | 命令示例 |
|---|---|
| 实时查看 | sudo journalctl -f |
| 按服务查看 | sudo journalctl -u nginx |
| 按时间查看 | sudo journalctl --since "2 hours ago" |
| 按优先级 | sudo journalctl -p err |
| 查看启动日志 | sudo journalctl -b |
| 查看前次启动 | sudo journalctl -b -1 |
| 查看指定文件 | sudo journalctl --file=/path/to/journal/file |
| 按进程ID | sudo journalctl _PID=1234 |
| 搜索关键词 | sudo journalctl -g "error" |
| 导出日志 | sudo journalctl > output.log |
| 清理旧日志 | sudo journalctl --vacuum-time=2weeks |
⚠️ 重要注意事项
- 权限要求 :大多数
journalctl命令需要sudo或root权限 - 持久化存储 :查看历史启动日志(如
-b -1)需要启用持久化存储 - 时间格式 :时间参数支持灵活格式,如
"yesterday"、"1 hour ago"、"2024-01-15 09:00:00" - 机器ID :每个系统有唯一的机器ID,位于
/etc/machine-id,日志目录以此命名
根据具体需求,可以组合使用这些命令来精确查找和分析系统日志。