journalctl 是 systemd 系统的日志查看工具,功能非常强大。
之前遇到过程序本地运行没问题,也能通过编译,部署到服务器没多久就蹦了,看日志一时间没看出啥问题,最后用journalctl排查出来了。
1. 实时查看日志
1
2
3
4
5
6
7
8
9
|
# 实时滚动查看最新日志
journalctl -f
# 查看指定服务的实时日志(这个贼好用)
journalctl -f -u nginx
journalctl -f -u docker.service
# 查看内核实时日志
journalctl -f -k
|
2. 查看今天/昨天的日志
1
2
3
4
5
6
7
8
9
10
11
|
# 查看今天的所有日志
journalctl --since today
journalctl -S today
# 查看昨天的日志
journalctl --since yesterday --until today
journalctl -S yesterday -U today
# 查看特定日期
journalctl --since "2024-01-15"
journalctl --since "2024-01-15 09:00:00" --until "2024-01-15 17:00:00"
|
3. 过滤和搜索
3.1. 按时间过滤
1
2
3
4
5
6
7
8
9
10
11
12
|
# 最近10分钟
journalctl --since "10 minutes ago"
# 最近1小时
journalctl --since "1 hour ago"
# 最近1天
journalctl --since "1 day ago"
# 指定时间段
journalctl --since "09:00" --until "10:00"
journalctl -S "2024-01-15 14:00" -U "2024-01-15 15:30"
|
3.2. 按优先级过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 只看紧急(0)和警报(1)级别
journalctl -p 0..1
# 只看错误级别及以上(0-3)
journalctl -p err # 或者 journalctl -p 3
journalctl -p error
# 只看警告及以上
journalctl -p warning # 4
journalctl -p warn
# 只看信息和调试
journalctl -p info # 6
journalctl -p debug # 7
# 优先级范围(3-5,即错误、警告、通知)
journalctl -p 3..5
# 优先级对照表:
# 0: emerg 紧急
# 1: alert 警报
# 2: crit 严重
# 3: err 错误
# 4: warning 警告
# 5: notice 通知
# 6: info 信息
# 7: debug 调试
|
3.3. 按服务/单元过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 查看特定服务的日志
journalctl -u nginx.service
journalctl -u docker
journalctl -u sshd
# 查看多个服务
journalctl -u nginx -u mysql
# 查看失败的服务
journalctl --failed
journalctl -u nginx.service --no-pager | tail -20
# 查看系统引导相关服务
journalctl -b # 本次启动
journalctl -b -1 # 上一次启动
journalctl -b -2 # 上上次启动
|
3.4. 按进程/用户过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 按进程ID查看
journalctl _PID=1234
journalctl _PID=1234 _PID=5678
# 按进程名查看
journalctl _COMM=sshd
journalctl _COMM=nginx
# 按用户查看
journalctl _UID=1000
journalctl _UID=0 # root用户
# 按可执行文件路径
journalctl /usr/sbin/sshd
journalctl /usr/bin/dockerd
|
3.5. 按字段过滤
1
2
3
4
5
6
7
8
9
|
# 查看特定主机名
journalctl _HOSTNAME=server1
# 查看特定系统调用
journalctl _SYSTEMD_CGROUP=/system.slice/docker.service
# 组合过滤
journalctl _UID=0 _COMM=sshd
journalctl _SYSTEMD_UNIT=nginx.service + _PID=12345
|
4. 输出格式控制
4.1. 不同输出格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# 默认格式(分页显示)
journalctl
# 不翻页,直接输出
journalctl --no-pager
# 只显示最新的N行
journalctl -n 20
journalctl --lines=50
# 显示完整时间戳
journalctl -o verbose
# JSON格式(适合程序处理)
journalctl -o json
journalctl -o json-pretty
journalctl -o json | jq . # 需要安装jq
# 简短格式
journalctl -o short
journalctl -o short-iso # ISO时间格式
journalctl -o short-precise # 精确到微秒
# 只显示消息(无元数据)
journalctl -o cat
# 导出格式
journalctl -o export
# 表格格式
journalctl -o with-unit
|
4.2. 输出到文件
1
2
3
4
5
6
7
8
9
|
# 保存日志到文件
journalctl --since "1 hour ago" > /tmp/journal.log
journalctl -u nginx -o json > nginx_logs.json
# 追加模式
journalctl --since today >> /var/log/daily.log
# 压缩保存
journalctl --since "1 month ago" | gzip > /tmp/old_logs.gz
|
5. 高级搜索技巧
5.1. 关键词搜索
1
2
3
4
5
6
7
8
9
10
11
|
# 搜索包含关键词的日志
journalctl -k # 内核日志中搜索
journalctl -g "error" # 全局搜索
journalctl --grep="failed"
journalctl --grep="timeout" --case-sensitive=false
# 搜索并高亮显示
journalctl -g "error" | grep --color=auto -i error
# 反向搜索(不包含)
journalctl --grep="error" --invert-match
|
5.2. 组合查询
1
2
3
4
5
6
7
8
|
# 今天nginx的错误日志
journalctl -u nginx -p err --since today
# 最近1小时ssh的警告及以上
journalctl -u sshd -p warning..emerg --since "1 hour ago"
# 指定时间的特定进程
journalctl _COMM=myapp --since "14:00" --until "15:00" -p err
|
6. 实用操作
6.1. 查看启动过程
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 查看本次启动的所有日志
journalctl -b
# 查看上次启动的日志
journalctl -b -1
# 查看特定启动的日志
journalctl --list-boots # 列出所有启动
journalctl -b S-3 # 查看序号为-3的启动
# 查看内核环缓冲区
journalctl -k
journalctl -k --since "10 minutes ago"
|
6.2. 日志清理和管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看日志磁盘使用
journalctl --disk-usage
# 清理旧日志(保留指定大小)
sudo journalctl --vacuum-size=500M
# 清理旧日志(保留指定时间)
sudo journalctl --vacuum-time=30d
# 清理旧日志(保留指定数量)
sudo journalctl --vacuum-files=5
# 立即轮转日志
sudo journalctl --rotate
# 刷新日志到磁盘
sudo journalctl --flush
|
6.3. 系统状态检查
1
2
3
4
5
6
7
8
9
|
# 查看系统启动时间线
systemd-analyze blame
systemd-analyze critical-chain
# 查看服务依赖
systemd-analyze dot | dot -Tsvg > deps.svg
# 查看当前活动单元
systemctl list-units --type=service --state=running
|
7. 实用示例
7.1. 诊断服务问题
1
2
3
4
5
6
7
8
|
# 查看服务启动失败原因
journalctl -u failed-service --no-pager | tail -50
# 查看服务崩溃重启记录
journalctl -u myapp | grep -E "(exited|terminated|failed)" -i
# 查看服务的完整生命周期
journalctl -u docker --since "yesterday" --until "now" -o verbose
|
7.2. 排查系统问题
1
2
3
4
5
6
7
8
9
10
11
|
# 查看系统错误和警告
journalctl -p err..warning --since "1 hour ago" --no-pager
# 查看硬件错误
journalctl -p err -k | grep -i "hardware\|memory\|disk"
# 查看OOM Killer活动
journalctl -k | grep -i "oom\|killed process"
# 查看段错误
journalctl -k | grep -i "segfault\|general protection fault"
|
7.3. 监控安全事件
1
2
3
4
5
6
7
8
9
10
|
# 查看认证日志
journalctl _COMM=sshd
journalctl _COMM=login
journalctl SYSLOG_IDENTIFIER=su
# 查看失败的登录尝试
journalctl _COMM=sshd | grep -i "failed\|invalid"
# 查看sudo使用
journalctl _COMM=sudo
|
7.4. 性能监控
1
2
3
4
5
6
7
8
|
# 查看高负载期间日志
journalctl --since "$(uptime -s)" -p warning..emerg
# 查看内存不足警告
journalctl -k | grep -i "memory\|swap"
# 查看磁盘错误
journalctl -k | grep -i "disk\|I/O error"
|
8. 常用命令速查表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 1. 查看实时日志
journalctl -f
# 2. 查看特定服务
journalctl -u servicename
# 3. 查看今天错误
journalctl --since today -p err
# 4. 查看最近100行
journalctl -n 100
# 5. 查看启动相关
journalctl -b -1 # 上次启动
# 6. 查看内核日志
journalctl -k
# 7. 按时间过滤
journalctl --since "2 hours ago"
# 8. 搜索关键词
journalctl -g "error"
# 9. JSON格式输出
journalctl -o json-pretty
# 10. 查看磁盘使用
journalctl --disk-usage
|