我的论坛
登录

journalctl 基础教程

182
  • uvim
    管理员

    journalctl 是 Linux 中用于查看和管理 systemd-journald 服务日志的核心命令行工具。它可以帮助你快速检索系统、服务及内核的运行日志。


    核心基础命令

    * 查看所有日志:

    journalctl

    (默认进入 less 翻页模式:方向键上下滚动,Space 翻页,q 退出,/ 搜字符串)
    * 实时查看最新日志(类似 tail -f):

    journalctl -f

    * 显示最新 $N$ 行日志:

    journalctl -n 20

    * 反向显示(从最新日志开始):

    journalctl -r

    按条件筛选日志

    * 按指定服务/单元筛选:

    journalctl -u nginx.service

    * 按时间范围筛选:

    # 查找自指定时间以来的日志
    journalctl --since "2026-09-08 00:00:00"
    
    # 查找时间段
    journalctl --since "1 hour ago" --until "now"
    journalctl --since yesterday

    * 按日志级别筛选(0-7:Emerg 到 Debug):

    # 只看错误(Error)及更严重级别(Emerg, Alert, Crit, Err)
    journalctl -p err

    * 按进程 ID (PID) 或系统内核筛选:

    # 查看 PID 为 1234 的日志
    journalctl _PID=1234
    
    # 查看内核日志(类似 dmesg)
    journalctl -k

    系统与空间管理

    * 查看本次开机后的所有日志:

    journalctl -b

    * 查看上一次开机(前一趟运行)的日志:

    journalctl -b -1

    * 检查日志占用占用的磁盘空间:

    journalctl --disk-usage

    * 清理历史日志:

    # 保留最近 500MB 的日志,清理其余部分
    sudo journalctl --vacuum-size=500M
    
    # 只保留最近 7 天的日志
    sudo journalctl --vacuum-time=7d

    实用小技巧

    * 格式化输出(例如输出 JSON 格式供分析):

    journalctl -u nginx.service -o json-pretty

    * 精炼输出(隐藏主机名和无用字段):

    journalctl -u nginx.service -o cat
  • uvim
    管理员
    #1

    journalctl 的进阶用法侧重于多条件组合过滤、系统诊断分析、日志持久化配置,以及结合 JSON 与管道工具进行自动化日志解析。


    多条件高级组合筛选

    journalctl 支持通过逻辑与(空格分隔)和逻辑或(+ 分割)自由组合多个匹配参数。

    1. 逻辑与(同时满足多个条件)

    # 筛选 nginx 服务中,日志级别为 error 及以上,且发生在今天的日志
    journalctl -u nginx.service -p err --since today

    2. 逻辑或(满足任意一个条件)

    # 同时查看 sshd 服务和 nginx 服务的日志
    journalctl -u sshd.service + -u nginx.service

    3. 匹配特定元数据字段

    systemd-journald 为每条日志都标记了结构化的元数据属性:

    # 按特定可执行文件路径筛选
    journalctl /usr/sbin/sshd
    
    # 按特定用户 UID 筛选(例如 UID 1000)
    journalctl _UID=1000
    
    # 查看指定崩溃或事件关联的 cgroup 日志
    journalctl _SYSTEMD_CGROUP=/system.slice/docker.service

    验证技巧:运行 journalctl -o json-pretty -n 1,可以查看单条日志包含的所有可筛选元数据字段(如 _PID、_SYSTEMD_UNIT、_COMM 等)。


    系统故障排查与诊断

    1. 跨次开机(Boot ID)追踪

    定位死机重启或系统崩溃前的异常:

    # 列出历史记录中的所有开机记录(带有编号和 Boot ID)
    journalctl --list-boots
    
    # 查看倒数第二次开机(即上上次启动)期间的所有日志
    journalctl -b -2
    
    # 结合特定开机 ID 和优先级诊断故障
    journalctl -b -1 -p err

    2. 内核及硬件诊断

    # 查看内核日志并仅显示警告/错误(排查驱动或硬件故障)
    journalctl -k -p warning
    
    # 查看特定的设备路径日志(如 /dev/sda)
    journalctl /dev/sda

    结构化输出与管道处理

    journalctl 的 -o / --output 参数支持多种格式输出,便于配合 jq、grep 或 awk 分析。

    # 输出为 JSON 格式并使用 jq 提取特定字段(如消息本文与时间)
    journalctl -u sshd.service -o json | jq '{time: .__REALTIME_TIMESTAMP, msg: .MESSAGE}'
    
    # 输出简易格式(隐藏主机名和系统进程名,适合管道处理)
    journalctl -u nginx.service -o cat

    常见的 -o 输出选项包括:

    • short-iso:时间戳格式化为标准的 ISO 8601。
    • json-pretty:美化排版的 JSON,适合审查元数据结构。
    • verbose:展开显示每条日志的全部属性。

    日志持久化与存储优化

    默认情况下,部分 Linux 发行版的日志仅保存在内存内存(/run/log/journal/)中,重启后会丢失。

    1. 启用永久存储

    修改配置文件 /etc/systemd/journald.conf:

    [Journal]
    # 将 Storage 设置为 persistent 开启硬盘持久化保存
    Storage=persistent
    # 限制日志最大占用的磁盘空间
    SystemMaxUse=2G
    # 单个日志文件的最大容量
    SystemMaxFileSize=200M
    # 最长保留时间
    MaxRetentionSec=1month

    修改后保存并重启服务生效:

    sudo systemctl restart systemd-journald

    2. 日志完整性校验(防篡改验证)

    如果开启了 FSS(Forward Secure Sealing)安全特性,可以验证日志文件是否遭到了非授权改动或篡改:

    journalctl --verify

    验证成功后会返回 PASS 以及针对各日志文件的校验状态。

  • uvim
    管理员
    #2

    Q: sudo journalctl -u ssh -n 20 --no-pager

    这个命令太长了,我希望配置别名且支持 -n 传递指定数量


    为了支持动态传递参数(例如 -n 20 中的数字),不能直接使用标准的 alias,因为 standard bash alias 不支持把参数插到命令中间。

    最简单且标准的解决方法是定义一个 Shell 函数(Function),然后将其配置到 Shell 的配置文件中。

    方式一:定义为 Shell 函数(推荐)

    将以下代码写入你的配置文件(如果是 Bash 写入 ~/.bashrc;如果是 Zsh 写入 ~/.zshrc):

    # SSH 日志查询函数
    jssh() {
        sudo journalctl -u ssh -n "${1:-20}" --no-pager "${@:2}"
    }

    函数逻辑解析:

    • ${1:-20}:读取传入的第一个参数。如果没传参数,默认显示 20 条。
    • ${@:2}:允许传入额外的参数(例如添加 -f 进行实时追踪)。

    配置生效:

    修改完成后,执行 source ~/.bashrc(或 source ~/.zshrc)使其生效。

    使用示例:

    1. 默认查看 20 条日志:

    jssh

    验证:终端输出 SSH 服务的最后 20 行日志。

    2. 查看指定数量(如 50 条):

    jssh 50

    验证:终端输出 SSH 服务的最后 50 行日志。

    3. 搭配其他参数(如实时追踪最后 10 条):

    jssh 10 -f

    验证:显示最后 10 条日志并保持实时刷新的 stream 状态。


    方式二:免 sudo 优化(可选)

    如果你不想每次执行时输入 sudo 密码,可以把当前用户加入 systemd-journal 组:

    sudo usermod -aG systemd-journal $USER

    *执行后需重新登录或开启新终端生效。生效后可直接去掉函数中的 sudo。*

发表回复

登录后回复