journalctl

journalctl 是用于查询和显示 Systemd 日志守护进程 (journald) 收集的日志的工具。是 systemd 系统中的核心日志管理工具,它和传统的 syslog/var/log/messages 不同,采用 二进制日志数据库,配合 systemd 的服务管理,日志管理更强大

  • 属于 systemd-journald 服务的前端工具,用来 查询、过滤、管理 systemd 日志

  • 日志来源:

    • 内核(dmesg 替代品)
    • systemd 服务单元(unit)
    • 标准输出 / 标准错误(systemd 管理的服务自动收集)
    • Syslog API(兼容传统应用日志)

基础用法

  • journalctl: 显示所有收集到的日志(从最旧到最新)。
  • journalctl -r: 倒序显示所有日志(从最新到最旧)。
  • journalctl -f: 实时跟踪新生成的日志。
  • journalctl -e 跳到日志末尾(类似 tail -f)
  • journalctl -n 50 查看最近 50 行

按时间过滤

  • -b--boot: 显示本次系统启动以来的所有日志。
    • 示例: journalctl -b
  • -b -1: 显示上一次系统启动的日志。-b -2倒数第2次启动
  • --since / --until: 按绝对时间或相对时间过滤。
    • 示例: --since "2 hours ago"
    • 示例: --since "2025-10-26 10:00:00"
    • 示例: --since yesterday --until today (可使用 yesterday2 hours ago 等相对时间)

按单元和服务过滤

  • -u [UNIT]: 按 Systemd 单元名称过滤(最常用,用于查看服务日志)。
    • 示例: journalctl -u sing-box.service
  • -u [UNIT] -f: 实时跟踪特定服务的日志。
  • -t [TAG]: 按日志标签(Tag)过滤。
    • 示例: journalctl -t sshd
  • _PID=[PID]: 按进程 ID 过滤。
    • 示例: journalctl _PID=1234
  • _UID=[UID]: 按用户uid过滤
    • journalctl _UID=1000

按重要性(级别)过滤

使用 -p [LEVEL] 参数,显示该级别或更高级别的日志。

  • 重要性级别(从最高到最低):
    • emerg (0): 系统不可用
    • alert (1): 需要立即采取行动
    • crit (2): 严重错误
    • err (3): 错误情况
    • warn (4): 警告
    • info (6): 普通信息
    • debug (7): 调试信息
  • 示例: journalctl -p err (显示级别为 Error 及更紧急的所有日志)

输出控制

  • -n [LINES]: 限制输出行数。
    • 示例: journalctl -n 20 (只显示最新的 20 行)
  • -o [FORMAT]: 更改输出格式。
    • 常用格式: short (默认), json, json-pretty (美化 JSON)。
  • --no-full: 避免截断长行。
1
2
3
4
journalctl -o short        # 默认
journalctl -o json # JSON 格式
journalctl -o cat # 只输出消息本身
journalctl -o verbose # 输出所有字段(调试用)

实用组合示例

  • journalctl -xe: 扩展 (-x) 显示当前 Systemd 日志,常用于查看最近的错误信息。
  • journalctl -u sshd -r --since "01:00" -n 50: 倒序显示 SSHD 服务从今天凌晨 1 点以来的最新 50 条日志。
  • journalctl -b -p 3: 显示本次系统启动中所有级别为 错误 (err) 或更高级别的日志。

管理与维护

systemd 日志默认存储在:

  • **/run/log/journal/**(内存,重启丢失)
  • **/var/log/journal/**(磁盘,持久化)

要启用持久化日志:

1
2
mkdir -p /var/log/journal
systemctl restart systemd-journald

日志大小控制

配置文件:/etc/systemd/journald.conf
关键参数:

1
2
3
4
5
6
[Journal]
Storage=persistent # 持久化存储
SystemMaxUse=1G # 最大磁盘占用
SystemKeepFree=500M # 保留至少 500M 空间
SystemMaxFileSize=200M # 单个日志文件大小
SystemMaxFiles=10 # 最多几个文件

清理日志

1
2
3
journalctl --disk-usage          # 查看日志占用
journalctl --vacuum-size=500M # 保留最近 500M
journalctl --vacuum-time=7d # 保留 7 天

实际运维场景

  • 排查服务启动失败

    1
    2
    systemctl status nginx
    journalctl -u nginx -xe
  • 排查内核错误(OOM、panic、驱动)

    1
    journalctl -k -b -1
  • 安全审计(登录失败、sudo 使用情况)

    1
    2
    journalctl _COMM=sshd
    journalctl _UID=0

对比传统 syslog

特性syslogjournalctl (systemd)
日志格式纯文本二进制,可索引
过滤基于 grep/awk内建多维度过滤
查询速度依赖文本搜索快速索引,按字段过滤
持久化默认磁盘文件可选内存/磁盘
集中管理需 rsyslog/syslog-ng内建 API,可结合 ELK/Prometheus

journalctlsystemd 世界里的统一日志接口,它比传统 tail /var/log/messages 更强大,能按 服务、时间、PID、UID、级别 多维度过滤,还能控制存储策略。