参考资料
目录
- [一. 简介](#一. 简介)
-
- [1.1 systemd 出现之前的日志体系](#1.1 systemd 出现之前的日志体系)
- [1.2 systemd 普及后的日志体系](#1.2 systemd 普及后的日志体系)
- [二. journald](#二. journald)
-
- [2.1 简介](#2.1 简介)
- [2.2 与传统`syslog`对比](#2.2 与传统
syslog对比) - [2.3 `/var/log/journal/`目录下的日志文件](#2.3
/var/log/journal/目录下的日志文件) - [2.4 配置文件](#2.4 配置文件)
- [三. journalctl](#三. journalctl)
-
- [3.1 `-f` 实时查看日志](#3.1
-f实时查看日志) - [3.2 `--boot` 查看启动日志](#3.2
--boot查看启动日志) - [3.3 `-u` 查看某个服务的日志](#3.3
-u查看某个服务的日志) - [3.4 `--since` 与 `--until` 按时间查找](#3.4
--since与--until按时间查找) - [3.5 `-p err` 查看错误日志](#3.5
-p err查看错误日志) - [3.6 查看系统日志磁盘空间占用](#3.6 查看系统日志磁盘空间占用)
- [3.7 系统日志的清理](#3.7 系统日志的清理)
- [3.1 `-f` 实时查看日志](#3.1
一. 简介
⏹journald 和 journalctl 是一对 后台服务 + 查看工具,用来统一收集、存储和查看系统日志的。
systemd-journald(简称journald)- 日志服务本体:负责记录系统日志
journalctl- 日志查看命令:负责查看 / 查询日志
1.1 systemd 出现之前的日志体系
🔷特点
- 纯文本
- 行为简单、透明
- 管道清晰
🔷存在的问题:
- 日志格式不统一
- 字段没有结构化
- 高并发下性能一般
- 服务启动前的日志容易丢
bash
应用程序
↓
syslog() / logger
↓
rsyslog / syslog-ng
↓
/var/log/*.log(纯文本)
1.2 systemd 普及后的日志体系
🔷自2012年之后,systemd开始普及,日志体系如下所示
bash
应用 / 内核 / systemd
↓
systemd-journald ← 核心
↓
┌──────────────┐
│ 二进制日志 │
│/run /var/log │
└──────────────┘
↓(可选)
rsyslog / syslog-ng
↓
传统文本日志
🔷因为传统的syslog的生态十分庞大,网络设备和安全审计规范等领域依然需要syslog,所以并没有被取消。
- journald 不是 syslog 的替代品,而是 syslog 的上游。
- 现代 Linux:journald 负责
收,syslog 负责出。
bash
systemd-journald
├─ 保存二进制日志
└─ 转发到 /run/systemd/journal/syslog
↓
rsyslog
🔷整体鸟瞰图
bash
┌───────────────────────────────┐
│ 日志产生源 │
│───────────────────────────────│
│ kernel (printk) │
│ systemd services │
│ 用户程序 / 守护进程 │
│ logger / syslog() │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ systemd-journald │ ←【日志入口 / 中枢】
│───────────────────────────────│
│ • 接收所有日志 │
│ • 打时间戳 / PID / UID │
│ • 结构化存储(二进制) │
│ • 自动轮转 / 限额 │
└───────────────┬───────────────┘
│ │
│ ├─────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌──────────────────┐
│ /run/log/ │ │ /var/log/journal │
│ journal │ │(持久化 journal) │
│(内存) │ └──────────────────┘
└───────────────┘
│
│ (ForwardToSyslog=yes)
▼
┌───────────────────────────────┐
│ rsyslogd │ ←【传统兼容层 / 输出器】
│───────────────────────────────│
│ • 从 journald 读日志 │
│ • 规则过滤 / 分类 │
│ • 输出文本日志 │
│ • 网络转发 │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ /var/log/*.log │
│───────────────────────────────│
│ syslog / auth.log / kern.log │
│ daemon.log / app.log ... │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ logrotate │ ←【文本日志轮转】
│───────────────────────────────│
│ • 定期切割 │
│ • 压缩 │
│ • 删除旧日志 │
│ • 通知 rsyslog reopen │
└───────────────────────────────┘
二. journald
2.1 简介
🔷journald会接收来自以下来源的日志:
- 内核日志(dmesg)
- systemd 服务日志
- 各种系统服务(
ssh、cron、sudo等) - 用户程序通过
syslog/stdout/stderr输出的日志
🔷接收到日之后,会存储在下面的地方:
/run/log/journal:内存/var/log/journal:磁盘
🔷特点
- 二进制日志(不是纯文本)
- 自动带上结构化信息:
- 时间戳
- PID
- UID
- 服务名(unit)
- 可执行文件路径
- 支持:
- 日志轮转
※无需logrotate - 压缩
- 按大小 / 时间自动清理
- 日志轮转
2.2 与传统syslog对比
| 对比项 | journald | 传统 syslog |
|---|---|---|
| 日志格式 | 二进制(结构化) | 纯文本 |
| 查询能力 | 非常强(按字段) | 弱(grep) |
| 统一入口 | 是 | 否(分散) |
| 实时性 | 支持 | 支持 |
| systemd 集成 | 原生 | 非原生 |
2.3 /var/log/journal/目录下的日志文件
*.journal文件,就是journald的二进制日志数据库journalctl实际就是在读取这些文件
bash
apluser@FengYeHong-HP:~$ tree /var/log/journal/
/var/log/journal/
└── 7b644cb526e843fc910b92994eacfb94
├── system.journal
├── system@00063c5b254352e2-4f53057312b77dc2.journal~
├── system@00063d0283fb5bc6-904ac48255bcb5a2.journal~
├── system@00063d04ffcd0142-2a71f4e52179981f.journal~
└── user-1000.journal
1 directory, 5 files
apluser@FengYeHong-HP:~$
2.4 配置文件
bash
apluser@FengYeHong-HP:~$ ls -l /etc/systemd/journald.conf
-rw-r--r-- 1 root root 1282 Apr 8 2022 /etc/systemd/journald.conf
🔷下面是一份journald.conf文件的例子
bash
[Journal]
# ---------- 存储方式 ----------
# 持久化日志写入
Storage=persistent
# ---------- 空间控制(重点) ----------
# journal 总占用上限
SystemMaxUse=1G
# 磁盘最少剩余空间
SystemKeepFree=1G
# 单个文件最大大小
SystemMaxFileSize=100M
# ---------- 时间控制 ----------
# 最多保留30天的日志
MaxRetentionSec=30day
# ---------- 写入与性能 ----------
# 开启 journal 文件自动压缩, 减少日志量
Compress=yes
SyncIntervalSec=5m
# 防止某个服务疯狂刷日志把磁盘写爆, 30秒内, 最多允许 10000 条, 超出的直接丢弃并记录警告
RateLimitIntervalSec=30s
RateLimitBurst=10000
# ---------- 安全 ----------
# 开启安全审计, journal 文件带完整性校验, 可检测日志是否被篡改
Seal=yes
# 多用户系统, 可确保 root / 用户日志分开
SplitMode=uid
# ---------- 其他 ----------
# 保留传统日志,journald → rsyslog → /var/log/*.log
ForwardToSyslog=yes
🔷如果journald的配置文件被修改了,需要通过下面的命令重启journald
bash
sudo systemctl restart systemd-journald
三. journalctl
🔷journalctl 是 查看 / 查询 journald日志的命令行工具
3.1 -f 实时查看日志
- 类似于
tail -f
bash
apluser@ubuntu24-01:~$ journalctl -f
Dec 30 15:34:46 ubuntu24-01 PackageKit[95942]: daemon start
Dec 30 15:34:46 ubuntu24-01 dbus-daemon[885]: [system] Successfully activated service 'org.freedesktop.PackageKit'
Dec 30 15:34:46 ubuntu24-01 systemd[1]: Started packagekit.service - PackageKit Daemon.
Dec 30 15:35:01 ubuntu24-01 CRON[96144]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
Dec 30 15:35:01 ubuntu24-01 CRON[96145]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Dec 30 15:35:01 ubuntu24-01 CRON[96144]: pam_unix(cron:session): session closed for user root
Dec 30 15:35:01 ubuntu24-01 systemd[1]: apt-daily.service: Deactivated successfully.
Dec 30 15:35:01 ubuntu24-01 systemd[1]: Finished apt-daily.service - Daily apt download activities.
Dec 30 15:35:01 ubuntu24-01 systemd[1]: apt-daily.service: Consumed 19.351s CPU time.
3.2 --boot 查看启动日志
bash
apluser@ubuntu24-01:~$ journalctl --boot | head
Aug 14 07:35:18 ubuntu24-01 kernel: Linux version 6.8.0-71-generic (buildd@lcy02-amd64-053) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 (Ubuntu 6.8.0-71.71-generic 6.8.12)
Aug 14 07:35:18 ubuntu24-01 kernel: Command line: BOOT_IMAGE=/vmlinuz-6.8.0-71-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro
Aug 14 07:35:18 ubuntu24-01 kernel: KERNEL supported cpus:
Aug 14 07:35:18 ubuntu24-01 kernel: Intel GenuineIntel
Aug 14 07:35:18 ubuntu24-01 kernel: AMD AuthenticAMD
Aug 14 07:35:18 ubuntu24-01 kernel: Hygon HygonGenuine
Aug 14 07:35:18 ubuntu24-01 kernel: Centaur CentaurHauls
Aug 14 07:35:18 ubuntu24-01 kernel: zhaoxin Shanghai
Aug 14 07:35:18 ubuntu24-01 kernel: Disabled fast string operations
Aug 14 07:35:18 ubuntu24-01 kernel: BIOS-provided physical RAM map:
3.3 -u 查看某个服务的日志
bash
apluser@FengYeHong-HP:~$ journalctl -u ssh | head
Aug 14 20:51:11 FengYeHong-HP systemd[1]: Starting OpenBSD Secure Shell server...
Aug 14 20:51:13 FengYeHong-HP sshd[334]: Server listening on 0.0.0.0 port 22.
Aug 14 20:51:13 FengYeHong-HP sshd[334]: Server listening on :: port 22.
Aug 14 20:51:13 FengYeHong-HP systemd[1]: Started OpenBSD Secure Shell server.
-- Boot 31d0ca0261ca4c60bed5ff678f5be714 --
Aug 15 07:53:47 FengYeHong-HP systemd[1]: Starting OpenBSD Secure Shell server...
Aug 15 07:53:48 FengYeHong-HP sshd[277]: Server listening on 0.0.0.0 port 22.
Aug 15 07:53:48 FengYeHong-HP sshd[277]: Server listening on :: port 22.
Aug 15 07:53:48 FengYeHong-HP systemd[1]: Started OpenBSD Secure Shell server.
apluser@FengYeHong-HP:~$
3.4 --since 与 --until 按时间查找
--since:从某个时间点开始的日志
bash
apluser@ubuntu24-01:~$ journalctl --since "2025-12-20 10:00" | head
Dec 20 10:00:31 ubuntu24-01 systemd[1]: Starting sysstat-collect.service - system activity accounting tool...
Dec 20 10:00:31 ubuntu24-01 systemd[1]: sysstat-collect.service: Deactivated successfully.
Dec 20 10:00:31 ubuntu24-01 systemd[1]: Finished sysstat-collect.service - system activity accounting tool.
Dec 20 10:01:34 ubuntu24-01 systemd[1]: Starting fwupd-refresh.service - Refresh fwupd metadata and update motd...
Dec 20 10:01:34 ubuntu24-01 systemd[1]: fwupd-refresh.service: Deactivated successfully.
Dec 20 10:01:34 ubuntu24-01 systemd[1]: Finished fwupd-refresh.service - Refresh fwupd metadata and update motd.
Dec 20 10:05:01 ubuntu24-01 CRON[82718]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
Dec 20 10:05:01 ubuntu24-01 CRON[82719]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Dec 20 10:05:01 ubuntu24-01 CRON[82718]: pam_unix(cron:session): session closed for user root
Dec 20 10:10:34 ubuntu24-01 systemd[1]: Starting sysstat-collect.service - system activity accounting tool...
- 查看今天指定服务的日志
bash
apluser@ubuntu24-01:~$ journalctl -u ssh --since today
Dec 30 15:34:45 ubuntu24-01 sshd[95637]: Accepted publickey for apluser from 192.168.137.1 port 11122 ssh2: RSA SHA256:VNI4N/2gk8hX7hf4dp1rY1cHJ23SumccXly1777Eitw
Dec 30 15:34:45 ubuntu24-01 sshd[95637]: pam_unix(sshd:session): session opened for user apluser(uid=1000) by apluser(uid=0)
Dec 30 20:39:52 ubuntu24-01 sshd[97492]: Accepted publickey for apluser from 192.168.137.1 port 7988 ssh2: RSA SHA256:VNI4N/2gk8hX7hf4dp1rY1cHJ23SumccXly1777Eitw
Dec 30 20:39:52 ubuntu24-01 sshd[97492]: pam_unix(sshd:session): session opened for user apluser(uid=1000) by apluser(uid=0)
Dec 30 20:40:42 ubuntu24-01 sshd[97614]: Accepted publickey for apluser from 192.168.137.1 port 7994 ssh2: RSA SHA256:VNI4N/2gk8hX7hf4dp1rY1cHJ23SumccXly1777Eitw
Dec 30 20:40:42 ubuntu24-01 sshd[97614]: pam_unix(sshd:session): session opened for user apluser(uid=1000) by apluser(uid=0)
--until:截止到某个时间点的日志
bash
apluser@ubuntu24-01:~$ journalctl --since "2025-12-10 10:00" --until "2025-12-30 10:00" | head
Nov 30 20:45:15 ubuntu24-01 systemd-networkd[72683]: ens33: Gained carrier
Dec 14 19:45:45 ubuntu24-01 systemd-resolved[27545]: Clock change detected. Flushing caches.
Dec 14 19:45:45 ubuntu24-01 systemd-networkd[72683]: ens33: Lost carrier
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting apt-daily.service - Daily apt download activities...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting dpkg-db-backup.service - Daily dpkg database backup service...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting e2scrub_all.service - Online ext4 Metadata Check for All Filesystems...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting fstrim.service - Discard unused blocks on filesystems from /etc/fstab...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting fwupd-refresh.service - Refresh fwupd metadata and update motd...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting motd-news.service - Message of the Day...
Dec 14 19:45:45 ubuntu24-01 systemd[1]: Starting sysstat-collect.service - system activity accounting tool...
3.5 -p err 查看错误日志
⏹日志级别如下:
- emerg
- alert
- crit
- err
- warning
- notice
- info
- debug
bash
apluser@ubuntu24-01:~$ journalctl -p err | head
Sep 25 22:16:07 ubuntu221 kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
Sep 25 22:16:30 ubuntu221 login[1303]: PAM unable to dlopen(pam_lastlog.so): /usr/lib/security/pam_lastlog.so: cannot open shared object file: No such file or directory
Sep 25 22:16:30 ubuntu221 login[1303]: PAM adding faulty module: pam_lastlog.so
-- Boot d2c210f3a91f485786968cd34d0d4d9f --
Sep 25 22:20:13 ubuntu221 kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
Sep 25 22:20:23 ubuntu221 login[1060]: PAM unable to dlopen(pam_lastlog.so): /usr/lib/security/pam_lastlog.so: cannot open shared object file: No such file or directory
Sep 25 22:20:23 ubuntu221 login[1060]: PAM adding faulty module: pam_lastlog.so
-- Boot fe4732dd1ba34132b12361fea4fa0ad2 --
Sep 25 22:21:03 ubuntu221 kernel: piix4_smbus 0000:00:07.3: SMBus Host Controller not enabled!
Sep 25 22:21:24 ubuntu221 login[1197]: PAM unable to dlopen(pam_lastlog.so): /usr/lib/security/pam_lastlog.so: cannot open shared object file: No such file or directory
3.6 查看系统日志磁盘空间占用
bash
apluser@ubuntu24-01:~$ journalctl --disk-usage
Archived and active journals take up 257.6M in the file system.
3.7 系统日志的清理
- 手动触发日志轮转
bash
sudo journalctl --rotate
- 清理14天之前的旧日志
bash
sudo journalctl --vacuum-time=14d
- 将所有 journal 日志的【总占用空间】压缩到 ≤ 500MB
- journald 会 从最旧的日志开始删除,一直删除到总占用 ≤ 500M
bash
sudo journalctl --vacuum-size=500M