文章目录
-
- [1. 什么是 journalctl?](#1. 什么是 journalctl?)
- [2. 什么是 tail?](#2. 什么是 tail?)
- [3. 二者的根本区别](#3. 二者的根本区别)
- [4. 维度对比总结表](#4. 维度对比总结表)
- [5. journalctl 常用命令大全](#5. journalctl 常用命令大全)
- [6. tail 常用命令大全](#6. tail 常用命令大全)
- [7. SpringBoot 场景下如何选择?](#7. SpringBoot 场景下如何选择?)
- [8. systemd + journalctl 最佳实践](#8. systemd + journalctl 最佳实践)
- [9. tail -f 读取 Spring Boot 自定义日志最佳实践](#9. tail -f 读取 Spring Boot 自定义日志最佳实践)
- [10. 其他查看日志方式](#10. 其他查看日志方式)
- [11. 结论](#11. 结论)
1. 什么是 journalctl?
journalctl 是 systemd 的日志查看工具,读取的是系统级统一的二进制日志:
- 系统启动日志
- 系统服务日志(systemd 管控)
- 内核日志(dmesg)
- 任何使用 systemd 运行的服务的 stdout/stderr 输出
特点:
- ✅ 自动分模块(按服务过滤)
- ✅ 支持按时间筛选
- ✅ 支持持久化
- ✅ 可远程采集
- ✅ 本质是系统日志,而不是应用自己写的日志文件
2. 什么是 tail?
tail 是 Linux 中常用的"看文件尾部变化"命令。
常用场景:
- 查看 Spring Boot log 文件
- 查看 Nginx access.log / error.log
- 查看 MySQL 慢查询日志
- 查看业务专有日志
特点:
- ✅ 非 systemd
- ✅ 直接读取文本文件
- ✅ 简单高效
- ✅ 常用于应用层日志(比如 Spring Boot 的 Log 目录)
3. 二者的根本区别
| 分类 | journalctl | tail |
|---|---|---|
| 日志来源 | systemd 产生的 stdout/stderr | 文件系统中的具体 log 文件 |
| 数据格式 | 二进制 journal | 文本文件 |
| 适用场景 | 系统服务、系统事件、开机日志 | 应用自身日志(SpringBoot、Nginx 等) |
| 性能 | 日志量大时更高效(结构化) | 大文件时可能消耗更多 IO |
| 占用空间 | 自动管理、压缩 | 不自动管理,需要 logrotate |
| 查找能力 | 强(按服务、PID、时间) | 弱,只能查最后几行 |
| 实时查看 | journalctl -u xxx -f |
tail -f xxx.log |
| 日志丢失 | systemd 可能覆盖(被清理) | 文件可保留更久 |
4. 维度对比总结表
| 对比维度 | journalctl | tail | 评价 |
|---|---|---|---|
| 来源 | systemd 输出 | 文本日志文件 | 用途不同 |
| 实时性 | ★★★★★ | ★★★★★ | 都支持实时 |
| 过滤能力 | ★★★★★ | ★★☆☆☆ | journalctl 强太多 |
| 历史查询 | ★★★★★ | ★★★☆☆ | journalctl 更专业 |
| 性能 | ★★★★☆ | ★★★☆☆ | journalctl 更稳定 |
| 管理成本 | ★★★☆☆ | ★★☆☆☆ | tail 需要日志和 rotate |
| 新手友好 | ★★★☆☆ | ★★★★★ | tail 更简单 |
| 多行复杂日志 | ★★★★☆ | ★★☆☆☆ | tail 很难查 |
| 适用日志 | 系统日志/服务日志 | 应用程序日志 | 目的完全不同 |
| 适用场景 | systemd 服务 | SpringBoot 日志 | 需选对场景 |
5. journalctl 常用命令大全
bash
# 查看某个服务日志
journalctl -u myapp
# 实时输出日志(类似 tail -f)
journalctl -u myapp -f
# 只看今天日志
journalctl -u myapp --since today
# 按时间范围
journalctl -u myapp --since "2025-01-01 10:00" --until "2025-01-01 13:00"
# 查看错误级别日志
journalctl -p err -u myapp
# 查看服务崩溃原因
journalctl -u myapp -b
# 清理日志(按大小)
journalctl --vacuum-size=500M
6. tail 常用命令大全
bash
# 实时查看
tail -f app.log
# 查看最后 500 行
tail -n 500 app.log
# 多文件 tail
tail -f logs/*.log
# 搜索关键字实时刷新
tail -f app.log | grep ERROR
# 使用 less 实时查看
less +F app.log
7. SpringBoot 场景下如何选择?
- 📍 使用 jar 包目录的 Log/ 文件夹 → 推荐 tail
SpringBoot 日志文件独立输出:
/home/my/Log/*.log
适合:
bash
tail -f /home/my/Log/info.log
- 📍 systemd 只抓 stdout/stderr:
它只能看到:
- 程序启动时 JVM 输出
- 异常 crash 堆栈
- stdout 打印的内容
适用场景:
- 服务是否启动正常
- JVM 启动状态
- 自动重启情况
- 崩溃堆栈
业务逻辑日志仍用 tail。
8. systemd + journalctl 最佳实践
systemd 服务配置:
ini
StandardOutput=journal
StandardError=journal
意义:
- JVM 启动日志统一记录到系统日志
- 崩溃日志不会丢失
- 不影响 SpringBoot 自己生成的日志文件
查看方式:
bash
journalctl -fu myapp
9. tail -f 读取 Spring Boot 自定义日志最佳实践
bash
tail -f /home/my/Log/info.log
tail -f /home/my/Log/error.log
tail -f /home/my/Log/syslog.log
# 过滤关键字
tail -f info.log | grep -i warn
# 大文件查错
less +F info.log
10. 其他查看日志方式
less +F logfile:可实时查看,支持翻页和搜索grep:实时过滤关键词- IDE 插件:如 IntelliJ 的
File Watcher或日志插件 - 可结合
multitail查看多文件
11. 结论
| 功能 | 工具 | 推荐 |
|---|---|---|
| 查看 systemd 服务启动/停止/错误 | journalctl | 必须用 |
| 查看 JVM 启动参数、Crash、OOM | journalctl | 必须用 |
| 查看 SpringBoot 业务日志 | tail -f | 更合适 |
| 查看多行复杂业务日志 | tail -f | 强烈推荐 |
✅ journalctl 和 tail 都很好,但用途不同,选择对场景才能发挥最大价值。