引言
服务器出问题先看日志——但日志文件会撑爆磁盘、散落在每台机器上、几年前的日志没人归档。日志管理的三件事:轮转(不撑爆磁盘)、集中(一处看所有机器)、分析(从噪音里找线索)。本文先给日志系统全景,再拆 rsyslog(收集与转发) 与 logrotate(轮转) 两大工具,覆盖远程集中收集、journald 配合、日志安全合规与检索,最后给排错与实战。
前置:/linux-journald-logging/(journald 日志)。systemd 日志体系见该文;本文聚焦传统 syslog 与轮转。磁盘管理见 /linux-filesystem-disk/。
目录
- 1. 日志系统全景:产生、轮转、集中
- 2. rsyslog:日志收集架构
- 3. rsyslog 远程集中收集
- 4. logrotate:日志轮转核心
- 5. logrotate 配置与压缩
- 6. 日志安全与合规
- 7. 日志分析与检索
- 8. journald 与 rsyslog 的配合
- 9. 排错:轮转与收集问题
- 10. 速查表
- 延伸阅读
1. 日志系统全景:产生、轮转、集中
日志链路 = 产生(应用/系统)→ 收集(rsyslog)→ 轮转(logrotate)→ 集中(远程):
日志全链路:
应用写日志 → 系统日志(/var/log/syslog、应用自带)
→ rsyslog 收集与转发
→ logrotate 按大小/周期轮转(不撑爆磁盘)
→ 远程 rsyslog 集中(多台机器一处看)
→ journald 并行记录(systemd 体系)
| 工具 | 职责 | 关键点 |
|---|---|---|
| 应用/服务 | 产生日志 | 写 /var/log/ 或 stdout |
| rsyslog | 收集+转发 | facility/severity 分类 |
| logrotate | 轮转+压缩 | 大小/周期触发 |
| journald | systemd 日志 | 结构化、二进制 |
心智:日志管理两件大事 = 别撑爆磁盘(轮转)+ 别到处翻(集中)。logrotate 管前者、rsyslog 管后者,两台工具是日志体系的底座。
2. rsyslog:日志收集架构
rsyslog 是 Linux 的传统日志守护进程——把日志按「来源+级别」路由到文件:
rsyslog 核心概念:
facility(来源):auth、kern、mail、daemon、user、local0-7
severity(级别):debug < info < notice < warning < err < crit < alert < emerg
规则:facility.severity → 目标(文件/远程/用户)
# 配置:/etc/rsyslog.conf
# 格式:facility.severity 目标
*.info;mail.none;authpriv.none /var/log/messages # 常规日志
authpriv.* /var/log/secure # 认证日志
cron.* /var/log/cron # 定时任务日志
# local0-7 留给应用自定义分类
local6.info /var/log/myapp.log # 应用日志
记忆:rsyslog 一行规则 = 「谁的什么级别 → 去哪」——
*.info表示「所有来源的 info 及以上」。应用日志常走local0-7自定义分类,方便单独归档。
3. rsyslog 远程集中收集
集中收集 = 所有服务器日志发到一台日志服务器——一处查全机房:
# 日志服务器侧(接收端):监听 514 UDP/TCP
sudo vim /etc/rsyslog.conf
# 取消注释或添加:
module(load="imudp") # UDP 接收模块
input(type="imudp" port="514")
module(load="imtcp") # TCP 接收模块
input(type="imtcp" port="514")
$template RemoteLogs,"/var/log/remote/%fromhost-ip%/%programname%.log"
*.* ?RemoteLogs # 按来源 IP 分目录
sudo systemctl restart rsyslog
# 各服务器侧(发送端):把日志转发到日志服务器
sudo vim /etc/rsyslog.d/50-remote.conf
*.* @192.168.1.10:514 # @ = UDP,@@ = TCP
sudo systemctl restart rsyslog
# 防火墙放行 514(日志服务器)
# nftables:allow tcp/udp 514 from 内网网段
心法:集中日志 = 「接收端开 imudp/imtcp 监听 + 发送端
@IP:514转发」。按来源 IP 分目录(%fromhost-ip%),几十台机器的日志在日志服务器上按机器分好——排查故障再也不用 ssh 到每台机器 tail。
4. logrotate:日志轮转核心
logrotate 防止日志文件无限长大撑爆磁盘——到条件就「轮转+压缩+清理」:
# 配置文件:/etc/logrotate.conf(全局)+ /etc/logrotate.d/*(分服务)
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # 轮转周期:daily/weekly/monthly
rotate 30 # 保留 30 份(30 天)
compress # 轮转后压缩(gzip)
delaycompress # 压缩延迟一轮(应用可能还写)
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 0640 app app # 轮转后重建空日志
postrotate # 轮转后执行(通知应用重开日志)
systemctl reload myapp > /dev/null 2>&1
endscript
}
# 手动触发测试(不破坏现有日志)
sudo logrotate -d /etc/logrotate.d/myapp # 调试(-d 只打印不执行)
sudo logrotate -f /etc/logrotate.d/myapp # 强制轮转(-f)
记忆:logrotate 三要素 = 周期(daily)、保留份数(rotate 30)、压缩(compress)。调完配置先
logrotate -d试跑,别直接改线上配置赌运气。
5. logrotate 配置与压缩
logrotate 常用指令与压缩策略:
# 按大小轮转(非时间)
/var/log/nginx/*.log {
size 100M # 满 100M 就轮转(比 daily 更适合高流量)
rotate 10
compress
missingok
postrotate
systemctl reload nginx
endscript
}
# 压缩策略对比
compress # gzip 压缩(省空间,读取需先解压)
delaycompress # 压缩延迟一轮(应用正在写不压)
nocompress # 不压缩(查询快,占空间)
| 指令 | 含义 | 场景 |
|---|---|---|
| daily / weekly / monthly | 周期轮转 | 常规 |
| size 100M | 按大小轮转 | 高流量服务 |
| rotate 30 | 保留份数 | 留存策略 |
| compress | gzip 压缩 | 省磁盘 |
| dateext | 文件名带日期 | 归档清晰 |
心法:高流量服务用
size而非daily——一天写 2G 的日志 daily 轮转一次照样爆盘;size 100M写满就转,配合rotate控制总占用。磁盘计算:100M × rotate 10 = 1G上限。
6. 日志安全与合规
日志是安全审计与合规的基石——完整、防篡改、可留存:
日志合规要点:
留存周期:按合规要求(等保/ISO 常 6 个月~1 年)
防篡改:权限收紧 + 远程集中(本地被删还有远程)
完整性:日志服务器只写不删(rotate 设长)
审计:认证日志(/var/log/secure)重点保护
# 日志权限收紧
chmod 640 /var/log/secure # 认证日志仅管理员可读
# rsyslog 集中 + 长留存,是合规最低配置
# 大日志留存在远程日志服务器,本地 rotate 短、远程 rotate 长
心法:合规的核心是「日志不能被攻击者随手删」——本地日志可被清,远程集中 + 只追加(appendonly/长留存)才能扛审计。等保测评必查认证日志留存与完整性。
7. 日志分析与检索
日志的价值在检索——从海量行里找线索:
# 常规检索
grep "ERROR" /var/log/myapp.log # 找错误
grep -i "timeout\|refused" /var/log/myapp.log # 多模式
tail -f /var/log/myapp.log # 实时跟踪
# 按时间/来源(rsyslog 集中日志)
grep "2026-09-28" /var/log/remote/10.0.0.5/myapp.log
# 频率统计(哪个错误最多)
grep "ERROR" /var/log/myapp.log | awk '{print $5}' | sort | uniq -c | sort -rn
# 结构化检索:journald
journalctl -u myapp --since "1 hour ago" --priority=err
记忆:日志分析三板斧 = grep 找关键词 → sort/uniq 做统计 → journalctl 按服务/级别筛。集中日志的杀手锏是「按 IP 按天翻」,故障定位从小时级缩到分钟级。
8. journald 与 rsyslog 的配合
journald(systemd 日志)与 rsyslog 并行——不是二选一,是分工:
journald:二进制、结构化、按服务/优先级查询(journalctl)
rsyslog:传统文本、可转发集中、可轮转
配合:journald 收集 → 转发给 rsyslog → rsyslog 文本化+集中
# 看 journald 转发设置
grep ForwardToSyslog /etc/systemd/journald.conf
# 默认 journald 会把日志也写进 rsyslog(/var/log/messages)
# journald 存多少(防 /var/log/journal 爆盘)
# /etc/systemd/journald.conf
SystemMaxUse=1G # journal 占用上限
# 常用 journalctl 检索
journalctl -u nginx --since today # 某服务今天
journalctl -p err --since "-1h" # 过去 1 小时 err 级
journalctl -b # 本次开机
记忆:journald 是「结构化查询」,rsyslog 是「传统流转发」。生产常用组合:journald 本地查、rsyslog 转发远程集中;两套都留,取证时互相比对。
9. 排错:轮转与收集问题
日志管理排错三板斧:
# 1. 轮转没生效
sudo logrotate -d /etc/logrotate.d/myapp # 调试看轮转逻辑
sudo logrotate -f /etc/logrotate.d/myapp # 强制轮转验证
ls -lh /var/log/myapp/ # 看压缩后文件生成
# 2. 收集不到(集中日志)
systemctl status rsyslog # 服务起来没
ss -ulnp | grep 514 # 514 端口监听没
# 客户端:logger -t test "hello" → 看远程是否收到
# 3. 日志爆盘
du -sh /var/log/* | sort -rh | head # 找出大日志
# 加大 logrotate 频率/加 size 限制
| 现象 | 原因 | 解法 |
|---|---|---|
| 日志没轮转 | rotate 配置错/没跑 | logrotate -d 调试 |
| 集中收不到 | 防火墙 514 没放 | nftables 放行 |
| 日志文件巨大 | 没配 logrotate | 加 size + rotate |
| journald 爆盘 | SystemMaxUse 太大 | 限 1G |
记忆:日志排错 = 轮转用
logrotate -d调试、集中用ss -lunp看端口 +logger -t打测试、爆盘用du -sh找元凶。三招覆盖 90% 日志问题。
10. 速查表
| 需求 | 工具 | 关键配置 |
|---|---|---|
| 收集日志 | rsyslog | *.info → /var/log/messages |
| 集中收集 | rsyslog 远程 | 接收端 imudp/imtcp + @IP:514 |
| 日志轮转 | logrotate | daily + rotate 30 + compress |
| 按大小轮转 | logrotate | size 100M |
| 轮转调试 | logrotate | logrotate -d 文件 |
| 结构化查询 | journalctl | -u 服务 --since today |
| 实时跟踪 | tail | tail -f /var/log/x |
| 错误统计 | grep+awk | grep ERROR | uniq -c | sort -rn |
| 防篡改留存 | rsyslog 集中 | 远程只写不删 |
一句话记忆:rsyslog 管「收集与集中」(@IP:514 一发全收)、logrotate 管「轮转与压缩」(daily/size + rotate + compress)、journalctl 管「结构化查询」——日志不爆盘、一处看全机房、三招排错,运维日志体系就立住了。
延伸阅读
- /linux-journald-logging/ — journald 日志体系
- /linux-filesystem-disk/ — 磁盘管理与日志占空间排查
- /linux-cron-scheduled-tasks/ — 定时清理日志实战
- /linux-security-hardening/ — 日志安全与审计
- [[docker]] — 容器日志驱动与收集
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。