logrotate不直接支持按网络协议切割日志,但可通过服务配置将HTTP、TCP/UDP、SSH等协议日志分离至不同文件,并为每个文件创建独立的logrotate规则,实现分类切割。关键步骤包括:Nginx按scheme分离HTTP/HTTPS访问日志,rsyslog按%protocol%模板保存远程日志,SSH日志独立记录;随后在/etc/logrotate.d/下为每类日志配置相应策略,如nginx-http设为daily保留7天,remote-syslog weekly保留12周,auth.log weekly保留4周,并启用compress、create等选项;最后通过logrotate -d和-f测试配置并验证切割效果。该方法本质是基于日志路径和服务类型实现协议级管理。

Linux系统中日志文件会随着时间不断增长,影响系统性能和管理效率。logrotate 是 Linux 下用于自动切割、压缩、归档日志的标准工具。虽然 logrotate 默认按时间或大小切割日志,但“按网络协议”切割并不是 logrotate 的原生功能。不过我们可以通过自定义配置,结合服务类型(如 TCP、UDP、HTTP 等)生成的日志路径,实现按协议分类并分别切割的目的。
理解“按网络协议切割”的实际含义
严格来说,logrotate 不直接识别网络协议来切割日志。所谓“按网络协议切割”,通常是指:
- 不同网络服务(如 Nginx 处理 HTTP、rsyslog 接收 UDP 日志)写入不同的日志文件
- 为每类协议对应的服务日志配置独立的 logrotate 规则
- 实现按服务/协议分类管理日志生命周期
因此,关键是将不同协议相关的日志分离到不同文件,并为每个文件设置独立的切割策略。
配置步骤:以常见网络协议日志为例
假设我们有以下几种协议相关的日志需要独立切割:
- HTTP/HTTPS:由 Nginx 记录访问日志
- TCP/UDP Syslog:由 rsyslog 接收远程日志
- SSH 登录:记录在 secure 或 auth.log 中
1. 确保日志按协议分离存储
先确认各服务已将日志写入独立文件:
# Nginx 配置(/etc/nginx/nginx.conf) access_log /var/log/nginx/access-http.log; error_log /var/log/nginx/error.log;若支持 HTTPS,可单独记录
access_log /var/log/nginx/access-https.log if=$scheme_https;
Rsyslog 接收远程 UDP/TCP 日志,按来源保存
/etc/rsyslog.conf
$ActionFileDefaultTemplate RSYSLOG_ForwardFormat module(load="imtcp" Port="514") module(load="imudp" Port="514")
按主机/IP或协议分类保存
$template RemoteLogs,"/var/log/remote/%fromhost%-%protocol%.log" . ?RemoteLogs
2. 为每类协议日志创建独立的 logrotate 配置
在 /etc/logrotate.d/ 下创建对应配置文件:
HTTP 访问日志切割(/etc/logrotate.d/nginx-http)
/var/log/nginx/access-http.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
HTTPS 访问日志切割(/etc/logrotate.d/nginx-https)
/var/log/nginx/access-https.log {
daily
missingok
rotate 10
compress
delaycompress
notifempty
create 0644 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
远程 UDP/TCP Syslog 切割(/etc/logrotate.d/remote-syslog)
/var/log/remote/*.log {
weekly
missingok
rotate 12
compress
notifempty
create 0644 syslog adm
olddir /var/log/remote/archive
prerotate
mkdir -p /var/log/remote/archive
endscript
}
SSH 登录日志切割(/etc/logrotate.d/ssh-auth)
/var/log/auth.log {
weekly
rotate 4
compress
missingok
notifempty
create 0640 root adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
验证与调试 logrotate 配置
配置完成后,建议进行测试:
-
语法检查:
logrotate -d /etc/logrotate.conf(dry-run 模式) -
手动执行:
logrotate -f /etc/logrotate.d/nginx-http -
查看状态:
cat /var/lib/logrotate/status
观察日志是否被正确切割、压缩,并确认 postrotate 脚本生效(如服务重载)。
总结:实现“按协议切割”的关键点
logrotate 本身不识别网络协议,但通过以下方式可实现按协议分类切割:
- 服务端配置日志分离,如 Nginx、rsyslog 按协议写入不同文件
- 每个协议对应一个或一组日志文件
- 为每类日志编写独立的 logrotate 配置,灵活设置周期、保留策略等
- 利用模板和变量(如 %protocol%)自动化命名和归档
基本上就这些。只要日志源头做好分类,logrotate 就能按需切割,达到“按网络协议管理日志”的效果。










