借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题
《业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1》
之前有做一定的优化
参考此篇:《使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1【优化篇】》 进行了rsync同步脚本的优化,优化内容如下 1、只同步源服务器上当天的日志文件(日志文件名中有日期)
2、排除掉异常的日志文件,加到排除名单文件中
vi /opt/server_logfiles_rsync.sh
#!/bin/bash
LOCK=/var/log/logs_rsync_record.log
FILENAME_MONTH=`date +%m`
FILENAME_DAY=`date +%e`
echo "同步日期:" >> ${LOCK} 2>&1
echo `date '+%Y-%m-%d_%T'` >> ${LOCK} 2>&1
echo "================= logs Rsync starting===============================" >> ${LOCK} 2>&1
rsync --progress -avz --exclude-from='/opt/exclude-files.txt' --perms --chmod=ugo+r -og --chown=root:root -e "ssh -p 22" root@192.168.31.170:/data/*_${FILENAME_MONTH}_${FILENAME_DAY}_*.txt /datarsync/ >> ${LOCK} 2>&1
echo "================= logs Rsync Finished===============================" >> ${LOCK} 2>&1
然后crontab定时同步
crontab -e
crontab -l
#每分钟同步一次
*/1 * * * * /opt/server_logfiles_rsync.sh
crontab定时任务最多能实现1分钟执行一次的频率
借助telegraf的inputs.exec模块实现秒级的shell脚本定时执行
参考此篇:《【优化篇】telegraf+shell脚本实现秒级的服务状态异常监测与告警》
telegraf部分配置如下
[[inputs.exec]]
commands = [
"sudo sh /opt/server_logfiles_rsync.sh"
]
name_override = "rsync"
timeout = "10s"
interval = "10s"
data_format = "value"
data_type = "string"
同步的频率设置成10秒1次
但是发现rsync+nxlog采集后发送给Graylog,Graylog的收到日志量暴增,如下图所示
(图片点击放大查看)
且业务侧反馈Graylog上面查询到的告警日志经常会有很多重复的日志,一直没有找到原因
后来经过借助chatgpt询问
rsync 将文件同步到本地Linux服务器上,在本地的Linux服务器上用nxlog读取该文件,发现读取时有重复,这是什么原因导致的?
(图片点击放大查看)
(图片点击放大查看)
(图片点击放大查看)
接着在原来的脚本的基础上面增加-u --update增量同步的参数
rsync --progress -avzu --min-size=1 --perms --chmod=ugo+r -og --chown=root:root -e "ssh -p 22" root@192.168.31.170:/data/*_${FILENAME_MONTH}_${FILENAME_DAY}_*.txt /datarsync/ >> ${LOCK} 2>&1
但是发现加了这个参数后问题依旧,还是会有重复读取的问题 这是觉得可能是nxlog的配置问题
继续询问chatgpt
(图片点击放大查看)
(图片点击放大查看)
(图片点击放大查看)
发现真正的原因是:日志文件被修改或替换:如果日志文件在 nxlog 启动后被修改或替换,可能导致文件的位置信息不准确。例如,当 rsync 同步过程中文件被替换为新的文件时,nxlog 可能会将其视为新文件,并从头开始读取。
这如何避免rsync同步时重复读取的这种情况?
(图片点击放大查看)
并且日志重复读取的时候,tail -f /var/log/nxlog/nxlog.log发现
nxlog 日志中出现大量 "reopening possibly rotated file”关键字
(图片点击放大查看)
(图片点击放大查看)
(图片点击放大查看)
配置 rsync 的 --inplace 参数:通过将 rsync 命令中的 --inplace 参数添加到命令中,可以使 rsync 在同步过程中直接将更新写入目标文件,而不是创建一个新的临时文件后再替换。这样可以确保文件的 inode 和修改时间保持不变,避免引起 nxlog 重新读取文件。
这时修改脚本即可,添加--inplace参数 server_logfiles_rsync.sh 最终的脚本如下
#!/bin/bash
FILENAME_MONTH=`date +%m`
FILENAME_DAY=`date +%d`
LOCK=/var/log/rsynclogs/logs_rsync_record_${FILENAME_MONTH}_${FILENAME_DAY}.log
echo "同步日期:" >> ${LOCK} 2>&1
echo `date '+%Y-%m-%d_%T'` >> ${LOCK} 2>&1
echo "================= logs Rsync starting===============================" >> ${LOCK} 2>&1
rsync --progress -avuz --inplace --exclude-from='/opt/exclude-files.txt' --perms --chmod=ugo+r -og --chown=root:root -e "ssh -p 22" root@192.168.31.170:/data/*_${FILENAME_MONTH}_${FILENAME_DAY}_*.txt /datarsync/ >> ${LOCK} 2>&1
echo "================= logs Rsync Finished===============================" >> ${LOCK} 2>&1
然后日志量明显下降,且日志未再重复
(图片点击放大查看)
本文分享自 WalkingCloud 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!