借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

借助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的收到日志量暴增,如下图所示 

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

且业务侧反馈Graylog上面查询到的告警日志经常会有很多重复的日志,一直没有找到原因

四、借助chatgpt解决该问题的过程

后来经过借助chatgpt询问

rsync 将文件同步到本地Linux服务器上,在本地的Linux服务器上用nxlog读取该文件,发现读取时有重复,这是什么原因导致的?

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+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

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题(图片点击放大查看)

发现真正的原因是:日志文件被修改或替换:如果日志文件在 nxlog 启动后被修改或替换,可能导致文件的位置信息不准确。例如,当 rsync 同步过程中文件被替换为新的文件时,nxlog 可能会将其视为新文件,并从头开始读取。

这如何避免rsync同步时重复读取的这种情况?

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

并且日志重复读取的时候,tail -f /var/log/nxlog/nxlog.log发现 

 nxlog 日志中出现大量 “reopening possibly rotated file”关键字

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

五、最终的解决办法:

配置 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

然后日志量明显下降,且日志未再重复 

借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

(图片点击放大查看)

原文始发于微信公众号(WalkingCloud):借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/243269.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!