
我在多年为客户运维 Linux 服务器(包括高并发电商平台、游戏服务器、实时视频服务等)过程中,深刻体会到日志系统对于运维、监控、安全审计甚至合规性都是核心组成部分。掌握 Linux 三大日志"基石"---journalctl、rsyslog 与 logrotate,是每位资深运维工程师的必备技能。
这篇文章不仅讲原理,还会结合真实香港服务器https://www.a5idc.com/配置(如 CPU、磁盘布局、日志分区规划)、代码示例、执行命令、数据表比较与实践经验,确保你读完就能立刻在生产环境落地。
一、日志系统概览与三个组件职责
Linux 日志系统主要由三个核心部分组成:
| 组件 | 职责 | 数据形式 | 是否持久化默认 |
|---|---|---|---|
systemd-journald |
捕获系统内核、服务单元日志 | 二进制结构化日志 | 默认只内存(/run/log/journal),可持久化 |
rsyslog |
把日志写入传统文本文件,支持过滤/转发 | 文本 | 是,/var/log/... |
logrotate |
自动进行日志轮转、压缩与清理 | 与文件系统协同 | 是,按规则 |
此外还有内核日志(dmesg)、各种应用日志等配套日志。
二、journalctl:从二进制到结构化查询的利器
journalctl 是 systemd 提供的查询系统日志的工具。与传统文本日志相比,它最大的优势是:
- 支持结构化查询(按时间、单位、优先级过滤)
- 二进制+索引实现快速检索
- 支持持久化存储与按用户权限访问
1) 默认行为和持久化配置
默认情况下,systemd-journald 会把日志保存在内存目录 /run/log/journal,系统重启后日志丢失。为了持久化,我们需要:
bash
sudo mkdir -p /var/log/journal
sudo vim /etc/systemd/journald.conf
# 修改或添加
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=50M
MaxRetentionSec=30day
然后重启服务:
bash
sudo systemctl restart systemd-journald
这样设置可以让 journal 日志持久保存最多 30 天,并且最大总占用不超过 500M。
日志默认按二进制存储,大量日志可能占用较多空间(例如持久化后 1 周可能达到几百 MB),因此要搭配容量控制等策略。
2) 常用查询命令实例
bash
# 查看最近所有日志
journalctl -e
# 按时间范围过滤
journalctl --since "2025-12-01 00:00" --until "2025-12-07 23:59"
# 查看某个服务日志
journalctl -u nginx.service
# 按日志级别过滤
journalctl -p err..alert
# 输出实时日志
journalctl -f
对比 grep 等文本工具效率:
使用 journalctl -o json-pretty 能返回结构化 JSON,便于日志聚合系统采集,再进一步统一上报到 ELK、Splunk、Logstash 等。
三、rsyslog:兼容传统与现代日志收集的主力
rsyslog(Rocket-fast System for LOG processing pipelines)是 Linux 传统的日志守护进程,它将接收到的日志按规则写到 /var/log/*.log 文件,还能转发到远程日志服务器。
1) 常见安装与启动
在 Ubuntu / Debian:
bash
sudo apt update
sudo apt install -y rsyslog
sudo systemctl enable --now rsyslog.service
在 CentOS / RHEL:
bash
sudo yum install -y rsyslog
sudo systemctl enable --now rsyslog
2) 配置过滤、输出与远程转发示例
配置文件位置
主配置:/etc/rsyslog.conf
模块及自定义规则:/etc/rsyslog.d/*.conf
示例:接收本机所有 kern、authpriv 级别日志:
bash
# /etc/rsyslog.d/custom.conf
kern.* /var/log/kernel.log
authpriv.* /var/log/auth.log
远程日志转发:
bash
# 客户端
*.* @@logs.mycorp.com:514 # @@ 代表 TCP
# 服务器端接收
module(load="imtcp")
input(type="imtcp" port="514")
远程日志必须在防火墙允许 514/TCP 或 514/UDP。
3) rsyslog 高级特性
| 特性 | 描述 |
|---|---|
| 多线程 log 处理 | 提升并发日志写入 |
| 复杂过滤表达式 | 支持正则和属性匹配 |
| 多输出格式 | 文本、JSON、数据库 |
| 支持 TLS 安全传输 | 日志加密防窃听 |
例如使用 JSON 输出:
bash
template(name="jsonFormat" type="list"){
constant(value="{")
constant(value="\"timestamp\":\"") property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"msg\":\"") property(name="msg")
constant(value="\"}\n")
}
*.* action(type="omfile" file="/var/log/json.log" template="jsonFormat")
四、logrotate:日志生命周期的守护者
日志量不控制,会快速吃光磁盘空间。logrotate 是 Linux 默认的日志轮转工具,它根据规则自动轮转、压缩和清理日志。
1) logrotate 版本与默认行为
查看版本:
bash
logrotate --version
默认输出类似:
logrotate 3.21.0
Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
这显示 logrotate 3.21.0(不同发行版略有版本差异)。
2) 全局和服务单独配置
全局主配置 /etc/logrotate.conf:
conf
weekly
rotate 6
compress
dateext
include /etc/logrotate.d
表示每周轮转一次,最多保留 6 个周期(约 6 周)的压缩日志。
rsyslog 单独规则 /etc/logrotate.d/rsyslog:
conf
/var/log/syslog
/var/log/auth.log
/var/log/kern.log
{
daily
rotate 30
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
解释:
daily:每日轮转rotate 30:保留 30 个周期compress+delaycompress:压缩但延迟至下一周期postrotate:轮转后通知 rsyslog 重启写入句柄
3) 实例:应用自定义日志轮转
假设我们有自定义服务 myapp 每天会产生日志:
conf
/var/log/myapp/*.log {
daily
size 100M
rotate 14
compress
missingok
notifempty
copytruncate
}
说明:
- 当单文件超过 100M 时也触发轮转
- 保留 14 轮
- 采用
copytruncate(避免停止服务)
五、真实案例评测:两种日志策略对比
下面我们对比两种典型日志策略在"高日志量服务器"上的表现:
| 指标 | 方案 A:仅 rsyslog + logrotate | 方案 B:journalctl 持久 + rsyslog + logrotate |
|---|---|---|
| 磁盘占用 | 约 3GB/月 | 约 5--7GB/月(含 journal 二进制) |
| 查询速度(近一周) | 快(grep) | 更快(索引查询) |
| 跨服务聚合 | 需手工 | 内建支持(journal) |
| 持久性 | 依赖文本文件 | 更强(结构化索引) |
结论:如果日志分析主要是"纯文本 grep",rsyslog + logrotate 足够。但在"快速定位多服务问题、跨服务日志聚合、按时间区间查询"方面,journalctl 优势明显。
六、硬件与存储规划建议
日志写入是 I/O 密集型操作,对磁盘性能有要求:
| 配置 | 建议 |
|---|---|
| CPU | 4 核以上 |
| 内存 | 日志量大时建议 ≥16GB(journal-cache) |
| 磁盘 | /var/log 块存储或单独 SSD |
| 文件系统 | ext4 或 XFS |
| 持久 journal | 放在 SSD 上(避免重启数据丢失) |
建议 /var/log 分区保留 ≥ 50GB,否则容易因日志爆满导致系统故障。
七、最佳实践与运维技巧
- 日志分区独立:避免日志填满系统盘造成整机不可用。
- 结合集中式平台:配合 Elastic Stack、Grafana Loki、Splunk 等进行聚合分析。
- 动态监控告警:配合 Prometheus + Alertmanager 监控日志增长与错误率。
- 安全审计日志备份:合规场景下建议定期归档到离线存储如 S3,并进行 WORM 设置。
- 合理设置保留策略 :根据公司法规调整
logrotate和 journal 保留参数。
八、总结
- journalctl:最适合结构化、快速检索与跨服务分析。
- rsyslog:最稳定的文本日志写入服务,兼容性好。
- logrotate:日志生命周期管理的守护者。
这三者结合、合理配置和规划磁盘与轮转策略,是构建高可用、可追踪、可审计 Linux 日志系统的基础。