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

最佳实践

  1. 使用时间范围:始终使用--since--until缩小范围
  2. 按优先级过滤:使用-p参数只看需要的级别
  3. 结合grep:复杂搜索使用--grep而非管道到grep
  4. 实时监控:使用-f监控服务启动或故障
  5. 定期清理:配置自动清理策略防止磁盘占满
  6. 保存重要日志:重要事件导出备份
  7. 学习字段过滤:使用字段过滤比文本搜索更高效
  8. 使用反向搜索:排除无关信息时使用-v参数
posted @ 2026-01-09 10:05  圣光救赎者  阅读(12)  评论(0)    收藏  举报