Systemd 使用教程(五):日志查看工具 journalctl 介绍

本教程将由浅入深的介绍 linux 中 Systemd 的知识和相关使用(同时也方便自己后续查阅)

五、日志查看工具 journalctl 介绍

journalctl 是用于查询和管理 systemd 日志的命令行工具。

如果遇到服务启动失败,或者你的自定义服务中有一些排查日志,就可以通过 journalctl 查看详细日志

默认行为:如果你的服务通过 systemd 管理,它的日志会默认输出到 journal。服务的 stdout 和 stderr 被捕获,并作为日志条目存储。

5.1 日志相关配置

在服务的相关配置中,如下配置([Service] 部分)和日志输出关系比较大

  • StandardOutputStandardError:指定标准输出(stdout)和标准错误(stderr)的去向,可选值包括:journalsyslognullinheritfile:/path
  • SyslogIdentifier:指定某个标识符,用于进行日志过滤

而 journal 本身的配置文件(例如最大日志文件等),位于 /etc/systemd/journald.conf 中,可以修改后通过重启 systemd-journald 服务来使其生效(systemctl restart systemd-journald)。

5.2 journalctl 常用参数表

以下是可复制的 markdown 格式表格:

命令(短参数/长参数)说明示例常用程度
-u, --unit=UNIT按服务单元名(.service)过滤日志(最直接方式)journalctl -u nginx.service
(查看 Nginx 服务所有日志)
★★★★★(高)
-t, --identifier=IDSyslogIdentifier 筛选(需服务配置中显式设置)journalctl -t my_service
(若服务配置 SyslogIdentifier=my_service
★★★☆☆(中高)
-p, --priority=PRIORITY按日志级别过滤(如错误、警告)journalctl -u mysql.service -p err
(仅看 MySQL 错误日志)
★★★☆☆(中)
--since="TIME",
--until="TIME"
按时间范围过滤(支持 YYYY-MM-DD HH:MM:SS 或相对时间)journalctl -u apache2.service --since "2025-04-01" --until "2025-04-08"★★★★☆(高)
-f, --follow实时跟踪日志输出(类似 tail -fjournalctl -u docker.service -f
(实时查看 Docker 服务新日志)
★★★★★(高)
-n, --lines=NUM仅显示最近 N 条日志journalctl -u sshd.service -n 50
(查看 SSH 服务最近 50 条日志)
★★★★☆(高)
-b, --boot查看本次系统启动后服务的日志journalctl -u sshd.service -b
(查看上次启动后 ssh 服务产生的日志)
★★★☆☆(中)
-o, --output=FORMAT格式化输出(如 JSON、verbose)journalctl -u postgresql.service -o json-pretty
(以 JSON 格式查看详细日志)
★★☆☆☆(中低)
_PID=PID按进程 ID 过滤(服务启动后 PID 变化时使用)journalctl _PID=12345
(查看 PID 为 12345 的进程日志)
★★☆☆☆(低)
_UID=UID,
_GID=GID
按用户/组 ID 过滤(多用户场景)journalctl _UID=1000
(查看用户 1000 启动的服务日志)
★☆☆☆☆(低)
--merge合并标准输出和错误日志(默认分开显示)journalctl -u myapp.service --merge★★☆☆☆(中低)
-v, --verbose显示日志详细元数据(如时间戳、优先级)journalctl -u cron.service -v★★☆☆☆(中低)
-p, --priority=PRIORITY

支持如下值(前面是数字,后面是文字,都可以)

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug

实际使用时,支持

  • 单个值:包含等于或高于指定优先级的所有日志,例如配置了 err 实际是 emerg + alert + crit + err
  • 多个值:通过逗号分隔,例如 err,warning,debug 或者 3,4,7
  • 范围:通过 .. 链接,例如 0..3(包含边界)
--since="TIME",--until="TIME"
  1. 绝对日期时间格式
    • 完整日期时间格式
      • 格式:YYYY-MM-DD HH:MM:SS
      • 示例:journalctl --since "2025-04-08 10:30:00"
    • 仅指定日期
      • 格式:YYYY-MM-DD
      • 示例:journalctl --since "2025-04-08"
  2. 相对时间格式
    • 基于当前时间的相对值
      • 格式:数字 + 时间单位 + ago
      • 支持时间单位:secondsminuteshoursdaysweeksmonthsyears
      • 示例:journalctl --since "1 hour ago"
    • 其他相对时间表述
      • 可用表述:todayyesterdaytomorrow
      • 示例:journalctl --since "today"
-o, --output=FORMAT
格式描述使用场景建议
short默认格式,类似 syslog 输出。当你习惯 syslog 格式,想快速查看日志基本信息时使用,例如日常查看服务运行状态。
short-iso时间戳使用 ISO 8601 格式。需要遵循 ISO 8601 标准时间表示的场景,如与外部系统交互时共享日志。
short-precise时间戳包含微秒级精度。对日志记录时间精度要求极高的场景,如调试性能问题时,分析事件发生的精确时间顺序。
short-monotonic使用单调时间(从系统启动开始计算)。用于分析系统启动后事件的相对顺序,不依赖于系统时钟调整的情况。
verbose显示所有元数据字段,适合调试。当你需要深入排查问题,需要查看日志的所有详细信息,如环境变量、进程 ID 等。
export导出为二进制格式,适合与其他工具交互。将日志数据导出给其他工具进行进一步处理,如数据挖掘、分析统计等。
json以紧凑的 JSON 格式输出日志条目。方便程序解析日志数据,用于自动化处理或集成到其他系统中。
json-pretty以易读的 JSON 格式输出日志条目。方便人工查看和分析 JSON 格式的日志,适合开发人员调试和查看详细信息。
json-sse以 SSE 格式输出 JSON 数据,适合流式传输。用于实时日志监控和流式数据处理,如构建实时日志监控系统。
cat仅输出日志消息内容,忽略元数据。当你只关心日志的核心消息内容,不需要额外元数据时使用。
with-unit在 short 格式基础上显示日志所属的单元名称。方便快速定位日志所属的服务或单元,特别是在多服务的复杂系统中。

5.3 关于日志等级的一点小问题

我在实际看日志的过程中发现,journalctl 显示的大多数日志,都是 info 等级,进而想到了一个问题

应用程序是怎么和 systemd 交互,让他知道日志的等级的呢?

经过查询,服务可以单独的客户端,与 systemd 提供的日志读写接口交互,来区分日志等级,例如 python 中

import systemd.journal

# 创建一个 Journald 日志记录器
logger = systemd.journal.Reader()

# 设置日志级别为 err
level = systemd.journal.LOG_ERR

# 要记录的错误信息
error_message = "This is an error message from Python script."

# 记录 err 级别的日志
systemd.journal.send(error_message, PRIORITY=level)

但在实际的开发中可能要处理如下情况

  • 如何与 logging 模块联用:新增自定义 handler 的方式
  • 跨平台问题:windows 下的异常处理
  • 当程序没有被注册为 systemd 服务时,是否要将日志写入 journal?

总而言之,journalctl 功能强大,掌握其常用参数和配置方法,能有效帮助排查和管理 systemd 相关服务的日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值