Journalctl系统日志查看工具的介绍和使用

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
0%