目录
本教程将由浅入深的介绍 linux 中 Systemd 的知识和相关使用(同时也方便自己后续查阅)
五、日志查看工具 journalctl
介绍
journalctl
是用于查询和管理 systemd 日志的命令行工具。
如果遇到服务启动失败,或者你的自定义服务中有一些排查日志,就可以通过 journalctl
查看详细日志
默认行为:如果你的服务通过 systemd 管理,它的日志会默认输出到 journal。服务的 stdout 和 stderr 被捕获,并作为日志条目存储。
5.1 日志相关配置
在服务的相关配置中,如下配置([Service] 部分)和日志输出关系比较大
StandardOutput
和StandardError
:指定标准输出(stdout)和标准错误(stderr)的去向,可选值包括:journal
、syslog
、null
、inherit
、file:/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=ID | 按 SyslogIdentifier 筛选(需服务配置中显式设置) | 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 -f ) | journalctl -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"
- 绝对日期时间格式
- 完整日期时间格式
- 格式:
YYYY-MM-DD HH:MM:SS
- 示例:
journalctl --since "2025-04-08 10:30:00"
- 格式:
- 仅指定日期
- 格式:
YYYY-MM-DD
- 示例:
journalctl --since "2025-04-08"
- 格式:
- 完整日期时间格式
- 相对时间格式
- 基于当前时间的相对值
- 格式:
数字 + 时间单位 + ago
- 支持时间单位:
seconds
、minutes
、hours
、days
、weeks
、months
、years
- 示例:
journalctl --since "1 hour ago"
- 格式:
- 其他相对时间表述
- 可用表述:
today
、yesterday
、tomorrow
- 示例:
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 相关服务的日志。