Linux 日志管理:rsyslog 集中收集、logrotate 轮转与日志分析

深入 Linux 日志管理:日志系统全景(产生/轮转/集中)、rsyslog 架构与配置(facility/severity)、rsyslog 远程集中收集、logrotate 日志轮转(size/daily/compress)、日志安全与合规、journald 与 rsyslog 配合、日志分析与检索,掌握从单机排错到集中式日志平台的运维日志体系。

引言

服务器出问题先看日志——但日志文件会撑爆磁盘、散落在每台机器上、几年前的日志没人归档。日志管理的三件事:轮转(不撑爆磁盘)、集中(一处看所有机器)、分析(从噪音里找线索)。本文先给日志系统全景,再拆 rsyslog(收集与转发) 与 logrotate(轮转) 两大工具,覆盖远程集中收集、journald 配合、日志安全合规与检索,最后给排错与实战。

前置:/linux-journald-logging/(journald 日志)。systemd 日志体系见该文;本文聚焦传统 syslog 与轮转。磁盘管理见 /linux-filesystem-disk/。


目录


1. 日志系统全景:产生、轮转、集中

日志链路 = 产生(应用/系统)→ 收集(rsyslog)→ 轮转(logrotate)→ 集中(远程):

日志全链路:
  应用写日志 → 系统日志(/var/log/syslog、应用自带)
  → rsyslog 收集与转发
  → logrotate 按大小/周期轮转(不撑爆磁盘)
  → 远程 rsyslog 集中(多台机器一处看)
  → journald 并行记录(systemd 体系)
工具职责关键点
应用/服务产生日志写 /var/log/ 或 stdout
rsyslog收集+转发facility/severity 分类
logrotate轮转+压缩大小/周期触发
journaldsystemd 日志结构化、二进制

心智:日志管理两件大事 = 别撑爆磁盘(轮转)+ 别到处翻(集中)。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保留份数留存策略
compressgzip 压缩省磁盘
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
日志轮转logrotatedaily + rotate 30 + compress
按大小轮转logrotatesize 100M
轮转调试logrotatelogrotate -d 文件
结构化查询journalctl-u 服务 --since today
实时跟踪tailtail -f /var/log/x
错误统计grep+awkgrep 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]] — 容器日志驱动与收集

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux SSH 服务与隧道:sshd 配置、密钥认证、端口转发与安全加固
  2. Linux DNS 与 DHCP 服务:BIND/dnsmasq、zone 文件与解析排错
  3. Linux 定时任务:cron/at/anacron 与 systemd timer 全解析