filebeat日志采集的一次流程记录
背景:公司采购的一套第三方应用,部署在阿里云上,因为第三方有权限登录该服务器,所以不能将该服务器与公司的内网生产服务器进行打通 ,不能直接接入公司内网的已有的日志采集功能中,现在要想办法将该应用的日志采集到公司的日志采集中。
出于安全原因,公司的内网服务器的端口不能向阿里云服务器开放,google查了下文档,可以filebeat可以安装output.http插件,支持http请求的输出,公司的应用可以配置公网的域名,提供http接口给予阿里云上的filebeat进行调用 ,所以初步定的原型如下图。
这里需要将filebeat首先要安装一个插件,然后重新打包才行,因为原生的filebeat是不支持output.http的。filebeat的github地址是
beats % git remote -v
origin https://github.com/elastic/beats (fetch)
origin https://github.com/elastic/beats (push)
将项目下载到本地,切换版本到7.13版本的分支
参考文档 https://github.com/crazygreenpenguin/beats-output-http 进行插件的安装配置,这个项目的beats-output-http是针对filebeat v7以上版本的,虽然公司使用的filebeat版本是5.1.6,但是因为其相应的 https://github.com/raboof/beats-output-http beats-output-http插件配置好以后,使用go打包时,总是不成功。
package mainimport ("os"//这里配置插件的github地址_ "github.com/crazygreenpenguin/beats-output-http""github.com/elastic/beats/v7/filebeat/cmd"inputs "github.com/elastic/beats/v7/filebeat/input/default-inputs"
)// The basic model of execution:
// - input: finds files in paths/globs to harvest, starts harvesters
// - harvester: reads a file, sends events to the spooler
// - spooler: buffers events until ready to flush to the publisher
// - publisher: writes to the network, notifies registrar
// - registrar: records positions of files read
// Finally, input uses the registrar information, on restart, to
// determine where in each file to restart a harvester.
func main() {if err := cmd.Filebeat(inputs.Init, cmd.FilebeatSettings()).Execute(); err != nil {os.Exit(1)}
}
配置好以后,执行go build
命令进行打包,这里要注意,因为我打包的filebeat应用是要在CENTOS系统里运行的,所以打包的命令不能直接使用go build
,而要使用如下命令指定运行环境。
env GOOS=linux GOARCH=amd64 go build -o 指定文件名 main.go
如果执行go build
的过程中下载慢,则可以参考文档:https://blog.csdn.net/qq_43442524/article/details/104900180 配置go下载的代理。
go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct
执行后就会生成filebeat的执行文件了。接下来我们要在阿里云服务器上面运行这个filebeat的执行文件。将filebeat执行文件上传到阿里云服务器上的 filebeat
目录中。filebeat
目录中至少应当有这些文件和目录。
data
fields.yml
filebeat
filebeat.reference.yml
filebeat.yml
kibana
logs
module
modules.d
然后可以配置filebeat的配置文件 filebeat.yml,filebeat配置官方文档,我的配置内容文件如下,要注意的一点是配置文件不要用tab
进行缩进,要老老实实的敲空格。
filebeat.inputs:
- type: logenabled: truepaths:# 需要采集的文件路径,支持 *匹配- /apps/srv/instance/my-app/logs/info.logmultiline.pattern: ^\[multiline.negate: truemultiline.match: aftermultiline.timeout: 10signore_older: 10mclose_inactive: 3mclose_renamed: trueclose_removed: truescan_frequency: 1mtail_files: trueharvester_limit: 20480processors:- drop_fields:fields: ["prospector"]queue:mem:events: 10240flush.min_events: 2048flush.timeout: 5s#真实使用配置参考地址 https://github.com/crazygreenpenguin/beats-output-http
output.http:# 输出的请求地址url: 'http://mydomain.com/info-direct'max_retries: 0# 请求超时时间,这个很重要,默认是100response_header_timeout: 2000#调试用,可以看到filebeat输出的消息体
#output.console:
# pretty: true
然后创建启动脚本和停止脚本
启动脚本
restart.sh
启动filebeat的命令是 filebeat -e -c 配置文件
#!/bin/bashID=filebeat
ps -ef | grep yml | grep $ID | awk -F ' ' '{print $2}' | xargs kill -9 2>/dev/null;
echo "${ID}已终止,正在重启.."
nohup /usr/local/instance/filebeat-7/filebeat -e -c /usr/local/instance/filebeat-7/filebeat.yml >> /usr/local/instance/filebeat-7/logs/filebeat.log 2>&1 &
- 停止脚本
stop.sh
#!/bin/bashID=filebeat
ps -ef | grep yml | grep $ID | awk -F ' ' '{print $2}' | xargs kill -9 2>/dev/null;
echo "${ID}已终止"
为了获取接收http请求的消息体,就需要将filebeat.yml
中的output.console
放开,其他的output
先注释掉,然后就能在日志文件 filebeat.log
中看到发出的消息了。
output.console:pretty: true
可以看到,单条filebeat输出的消息的格式如下:
{"@timestamp": "2021-06-12T07:45:42.298Z","@metadata": {"beat": "filebeat","type": "_doc","version": "7.13.2"},"ecs": {"version": "1.8.0"},"host": {"name": "dmn202106110726"},"agent": {"type": "filebeat","version": "7.13.2","hostname": "dmn202106110726","ephemeral_id": "7d859dc2-8e0c-46df-91e0-b1094f284624","id": "551dddd3-6a61-4fdb-a5b6-6ca0c8c0f7e7","name": "dmn202106110726"},"log": {"file": {"path": "/usr/local/myapp/logs/threadPoolMonitorLog.log"},"offset": 410823},"message": "[2021-06-25 15:45:39.598] [INFO] [ThreadPoolMoniter-pool-17-thread-2] threadPoolMonitorLog 68 [151] - 线程池: ContactLabelUpdate-pool-22-thread-java.util.concurrent.ThreadPoolExecutor@2d32ac7f[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]","input": {"type": "log"}
}
也就是说,我们的接收filebeat的springboot项目要接收的消息就是上面代码这样的格式。在我们的接收filebeat消息的应用搭建跑起来以后,将output.console
注释掉,改为output.http
output.http:url: 'http://mydomain.com/info-direct'max_retries: 0
配置好以后,重启filebeat,然后我的web应用就接收到 filebeat发送来的消息体了,然后转换为公司内部的日志采集流程中的kafka消息格式进行发送。然后日志采集到磁盘和es都可以正常了。本来觉得已经没问题了,然后就检查一下日志是否正常吧,不检查还好,一检查完蛋。过了一小时了,日志还是1小时前的,感觉是不是有延迟啊,然后就等到第二天,我的老天,日志在昨天的那个时间点转呢,就一分钟的消息怎么都转不出来了,而且消息的时间是乱的,就是有的在前面有的在后面。然后看filebeat的日志,就是一直有一个retries
的消息,因为我的 output.http
的配置已经配置了max_retires:0
了,所以我感觉应该不会重试了吧,不会吧,不会吧。
然后我就排查了公司的日志采集的流程,很完美,没有瑕疵。难道是filebeat发消息的顺序是乱的?然后我有在阿里云服务器上面增加了一个springboot项目,来用http接收filebeat的http类型的output,结果也是顺序的。然后我就懵了,咋回事哦,filebeat的顺序也是对的,输出也很实时,为啥转发过来就延迟了那么长时间一致在1分钟那里转了呢?然后我就把阿里云服务器上面增加的springboot的日志和公司内网的springboot项目的日志都下载下来,从头按顺序往下翻,翻着翻着,您猜怎么着,感觉好多的日志都似曾相识,用sublimtext
把似曾相识的日志给匹配一下,渥的老哥,您再猜怎么着,循环了,一看到循环,就联想到retry,他这个就是不断的retry了,所以就循环了。
然后我就排查为什么filebeat会retry,看到了一个文章,找不到链接了,filebeat的消息发送是顺序的,消息发送成功的判定很简单,只要请求返回的状态是200就可以了,返回值是什么无所谓(这个是看 beats-output-http源码了解的),其实这个问题看filebeat输出的日志就能看出来,日志里面有timeout的字样,因为一开始就把这个给排除掉了,所以因为这个绕了三天的弯路。那么既然超时了,我们就要设置超时时间,我将超时时间设置为2000ms,然后日志就正常能够往后输出了。
queue:mem:events: 10240flush.min_events: 2048flush.timeout: 5s
output.http:# 输出的请求地址url: 'http://mydomain.com/info-direct'max_retries: 0# 请求超时时间,这个很重要,默认是100response_header_timeout: 2000# Specifies the amount of time in milliseconds to wait for a server's response# headers after fully writing the request (including its body, if any).# This time does not include the time to read the response body.# default=100ms
完结散花~~~~ 开玩笑的,当然没有了。虽然日志能继续往后刷了,但是刷的很慢,于是我加了一个请求次数统计,一统计,不得了,每分钟才能处理三十多次,好家伙,filebeat的消息发送是顺序的,刚刚我们说过了,需要前一条发送acked了,然后才能接着处理下一条,这瓶颈不就卡在了我这个应用上面了吗,虽然平均请求时间也就20ms,还没算网络传输的时间,这样每秒也就能处理50条啊,一分钟也就3000条,课时我们阿里云上面的应用,每秒就能产生数百条的日志,这个http请求处理的效率肯定不够,怎么办,只能在阿里云再增加一个springboot应用,快速的处理filebeat发出的请求,将消息缓冲,凑够几百条以后,在批量发给公司的应用进行批量循环处理发送,以缩短网络传输的时间了。就这么一弄,果然ok了,日志刷新是准实时的了。这会是真的完结散花了。
参考文档:
Filebeat 采集日志到 Kafka 配置及使用
https://lihuimintu.github.io/2019/08/05/Filebeat-Kafka/Centos安装Filebeat
https://blog.csdn.net/jeikerxiao/article/details/84841792filebeat kafka配置整理
https://blog.csdn.net/qq_41926119/article/details/104510481filebeat官方文档
https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.htmllinux查看环境变量
https://www.php.cn/linux-416847.html
go下载慢问题
https://blog.csdn.net/qq_43442524/article/details/104900180
filebeat 源码编译安装
https://www.cnblogs.com/dyh004/p/9673615.htmlbeats-output-http
https://github.com/crazygreenpenguin/beats-output-httpmac生成linux下可执行的.go二进制文件
https://blog.csdn.net/qq_37133717/article/details/84030814使用KafkaMagic查看kafka的消息内容
https://blog.csdn.net/lwlfox/article/details/104625366java发送kafka消息
https://blog.csdn.net/wobuaizhi/article/details/80950337
https://blog.csdn.net/u013144287/article/details/76277295
filebeat日志采集的一次流程记录相关推荐
- Filebeat日志采集器实例
目录 1 概述 2 安装Filebeat 2.1 配置Filebeat 2.2 配置Filebeat以使用Logstash 3 案例 3.1 流程说明 3.2 日志环境介绍 3.3 配置Filebea ...
- Filebeat+Kafka+ELK日志采集(二)——Filebeat
1.Filebeat概述 Filebeat用于日志采集,将采集的日志做简单处理(多行合并)发送至Kafka.Logstash.Elasticsearch等. 2.快速开始 先以最简模型快速开始再讲原理 ...
- 网站数据统计分析之二:前端日志采集是与非
在上一篇<网站数据统计分析之一:日志收集原理及其实现>中,咱们详细的介绍了整个日志采集的原理与流程.但是不是这样在真实的业务环境中就万事大吉了呢?事实往往并非如此.比如针对前端采集日志,业 ...
- golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践
在云原生时代和容器化浪潮中,容器的日志采集是一个看起来不起眼却又无法忽视的重要议题.对于容器日志采集我们常用的工具有filebeat和fluentd,两者对比各有优劣,相比基于ruby的fluentd ...
- 闲谈日志采集器FileBeat
为什么使用FileBeat? 日志采集器有很多,比如Logstash,虽然Logstash的功能强大,但是它依赖java并且在数据量大的时候进程会消耗过多的系统资源,会严重影响业务系统的性能. 而fi ...
- 【转】Filebeat+Kafka+Logstash+ElasticSearch+Kibana 日志采集方案
前言 Elastic Stack 提供 Beats 和 Logstash 套件来采集任何来源.任何格式的数据.其实Beats 和 Logstash的功能差不多,都能够与 Elasticsearch 产 ...
- 日志采集 - Filebeat
Filebeat 是什么? Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行索引.kaf ...
- Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)
前言 最近在搞一套完整的云原生框架,详见 spring-cloud-alibaba专栏,目前已经整合的log4j2,但是想要一套可以实时观察日志的系统,就想到了ELK,然后上一篇文章是socket异步 ...
- 网易基于Filebeat的日志采集服务设计与实践
- 背景 - 云原生技术大潮已经来临,技术变革迫在眉睫. 在这股技术潮流之中,网易推出了 轻舟微服务平台,集成了微服务.Service Mesh.容器云.DevOps等组件,已经广泛应用于公司内部,同 ...
- Filebeat+Kafka+ELK日志采集(一)
一.日志采集架构图: 二.模块功能说明: 2.1.filebeat Filebeat实现日志采集,采集指定路径的日志文件,并对日志格式.内容.字段等信息进行处理,发送至消息中间件.或发送至Logsta ...
最新文章
- 今天mtk笔试,没信心了
- 使用此代码可以解决python包导入路径问题?
- 019_Jedis的List数据类型
- linux系统日志_第十二章:走进Linux世界——系统日志管理,日志轮转。
- .net Core 3 preview 3试用 WPF,winform桌面开发
- SAP UI5 this.oModel.createBindingContext will trigger odata request
- php mysql 图像_将图像插入MySQL并使用PHP检索图像
- 版本代码详解:Alpha,Beta,Rc,GA,RTM,OEM等简称都代码什么意义
- android真实项目教程(五)——有时三点两点雨_by_CJJ
- java 任务栏程序_如何为Java Swing程序动态启用或禁用任务栏图标
- 关于android的tabhost中进行参数传递的问题
- Tomcat发布项目时,更改浏览器地址栏图标
- php数据库太小要怎么改,PHP入坑之 MySqli对数据库增删改查
- 中文界面blend_Blend Modes v3.4 – unity混合模式插件
- P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)
- ChatGPT提示词工程(六):Expanding扩展
- OriginPro2021安装注意事项(详细)
- 基于WebRtc实现安卓视频一对一聊天
- 1小时用马克笔画出时尚女郎
- windows安全警报怎么关闭_win10关闭Windows安全中心的操作方法