如何将轮转日志发送至rsyslog服务器?
如何将轮转日志发送至rsyslog服务器?
嗨,我完全懂你的困扰——用modfile只能同步正在运行的实时日志,那些已经轮转后被压缩成.gz的旧日志根本发不出去对吧?别慌,咱们分两步来搞定:处理已有的轮转日志,以及配置自动发送未来的轮转日志。
一、先把已有的压缩轮转日志发出去
你可以写个简单的shell脚本,批量解压并发送这些旧日志,再用定时任务自动跑。
- 创建脚本文件(比如
send-rotated-logs.sh),内容如下:
#!/bin/bash # 替换成你的日志目录 LOG_DIR="/var/log/your-app-logs" # 替换成rsyslog服务器的IP或主机名 RSYSLOG_SERVER="192.168.1.100" # rsyslog默认用UDP 514端口,用TCP的话换成-T参数和对应端口 LOG_PORT="514" # 遍历目录下所有.gz压缩日志 for log_file in "$LOG_DIR"/*.gz; do if [ -f "$log_file" ]; then # 解压并通过logger发送到服务器,用rotated-log标签方便识别 zcat "$log_file" | logger -t rotated-log -n "$RSYSLOG_SERVER" -P "$LOG_PORT" # 可选:发送完成后把文件移到存档目录,避免重复发送 # mkdir -p "$LOG_DIR/archived" # mv "$log_file" "$LOG_DIR/archived/" fi done
- 给脚本加执行权限:
chmod +x /path/to/send-rotated-logs.sh
- 用crontab设置定时任务,比如每天凌晨自动运行:
crontab -e
然后添加一行:
0 0 * * * /path/to/send-rotated-logs.sh >> /var/log/send-rotated-logs-cron.log 2>&1
二、让未来的轮转日志自动发送
调整logrotate的配置,让日志轮转完成后自动触发发送动作,不用每次手动处理。
找到你的应用对应的logrotate配置文件(通常在/etc/logrotate.d/目录下,比如/etc/logrotate.d/your-app),修改配置块,加上postrotate指令:
/var/log/your-app.log { daily rotate 7 compress missingok notifempty postrotate # 发送刚轮转压缩后的日志文件 zcat /var/log/your-app.log.1.gz | logger -t rotated-log -n 192.168.1.100 -P 514 endscript }
- 如果你想在轮转前发送未压缩的原日志副本,就把
postrotate换成prerotate,并把zcat改成cat。
三、确保rsyslog服务器能接收
服务器端的rsyslog配置要开启对应的接收模块,比如:
- 要是用UDP,在
/etc/rsyslog.conf里加:
module(load="imudp") input(type="imudp" port="514")
- 要是用TCP,就加:
module(load="imtcp") input(type="imtcp" port="514")
然后配置规则把接收的轮转日志存到指定文件:
:msg, contains, "rotated-log" /var/log/received-rotated-logs.log
最后重启rsyslog服务:
systemctl restart rsyslog
小提醒
- 确保运行脚本的用户(比如crontab用的root)有读取日志文件的权限
- 检查服务器防火墙是否开放了514端口(UDP/TCP根据你用的协议)
- 可以手动运行脚本测试,看看服务器端的日志文件是否有内容写入
备注:内容来源于stack exchange,提问作者Jessica Martinez
相关产品推荐
相关产品推荐

