前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >借助chatgpt解决GrayLog下使用rsync+nxlog采集日志时出现大量日志重复读取的问题

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

作者头像
yuanfan2012
发布2023-09-06 08:34:10
2730
发布2023-09-06 08:34:10
举报
文章被收录于专栏:WalkingCloudWalkingCloud

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

一、场景

《业务服务器免装插件,使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1》

之前有做一定的优化

参考此篇:《使用rsync+nxlog同步+采集应用日志并接入到GrayLog5.1【优化篇】》 进行了rsync同步脚本的优化,优化内容如下 1、只同步源服务器上当天的日志文件(日志文件名中有日期)

2、排除掉异常的日志文件,加到排除名单文件中

代码语言:javascript
复制
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定时同步

代码语言:javascript
复制
crontab -e
crontab -l
#每分钟同步一次
*/1 * * * * /opt/server_logfiles_rsync.sh 

二、后面再次优化

crontab定时任务最多能实现1分钟执行一次的频率

借助telegraf的inputs.exec模块实现秒级的shell脚本定时执行

参考此篇:《【优化篇】telegraf+shell脚本实现秒级的服务状态异常监测与告警

telegraf部分配置如下

代码语言:javascript
复制
[[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解决该问题的过程

后来经过借助chatgpt询问

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

(图片点击放大查看)

(图片点击放大查看)

(图片点击放大查看)

接着在原来的脚本的基础上面增加-u --update增量同步的参数

代码语言:javascript
复制
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 最终的脚本如下

代码语言:javascript
复制
#!/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

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

(图片点击放大查看)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WalkingCloud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、场景
  • 二、后面再次优化
  • 三、问题
  • 四、借助chatgpt解决该问题的过程
  • 五、最终的解决办法:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档