ELK太重?试试KFC日志采集

写在前面

  ELK三剑客(ElasticSearch,Logstash,Kibana)基本上可以满足日志采集、信息处理、统计分析、可视化报表等一些日志分析的工作,但是对我们来说……太重了,并且技术栈不是一路的。我们的场景是需要采集各个业务部门服务器上面的各个业务系统,所以尽量不要影响到服务器的性能,以侵入性最低的方式进行采集,不做其他多余操作。因而,在前端日志采集这块,对比其他Logstash、Flume等采集工具之后,决定采用轻量的Filebeat作为日志采集工具,Filebeat采用go开发,运行不需要额外部署环境,相比Flume依赖jdk轻量了不少,且占用内存低。

  采集链路如下所示:Filebeat日志采集、处理转换之后,推送到kafka,采用Clickhouse的kafka引擎进行消费存储。因而,我暂且称之为KFC????组合。

Filebeat部署

采集目标环境:

  系统:Window Server 2008 R2 Enterprise

  日志类别:IIS日志、业务系统日志

  日志路径:D:/IIS/www.A.com/logs/*.txt 、 

                        D:/IIS/www.B.com/logs/*.txt、

                        D:/IIS/www.C.com/logs/*.txt

  Filebeat:7.12.1

        因为采集的是windows操作系统,建议下载Filebeat压缩包,并以windows服务的方式运行,使用安装包msi安装不方便调试,需要频繁的卸载、安装操作,下载之后解压出来进行对配置文件 filebeat.yml 进行配置。

  业务系统日志格式示例:

2021-04-06 11:21:17,940 [39680] DEBUG Zc -  time:0ms update XXX set ModifyTime=GETDATE(), [State] = 190, [FuZeRen] = '张三' where [ID] = '90aa9a69-7a33-420e-808c-624693c65aef' and [CompanyID] = '9e52867e-2035-4148-b09e-55a90b3020d5' 
2021-04-06 11:21:21,612 [22128] DEBUG Service ModelBase -  time:0ms (/api/XXX/XXX/XXX?InfoID=6d43b831-6169-46d2-9518-f7c9ed6fe39c&ValidateStatus=1)更新材料状态
2021-04-06 11:21:21,612 [22128] DEBUG Zc -  time:0ms select ID from XXX where InfoRelationID='6d43b831-6169-46d2-9518-f7c9ed6fe39c' 
2021-04-06 11:21:21,612 [22128] DEBUG Zc -  time:0ms insert into XXXX(ValidateDate ,[ID],[ValidateState],[ValidateUser],[ValidateUserID],[ValidateUnit],[ValidateUnitID],[ValidateUnitType],[InfoRelationID]) values( GETDATE(),'c77cf4ab-71b5-46c7-b91b-2829d73aa700',1,'XXXX','0387f889-e1d4-48aa-b275-2241da1d2c9e','XXXXX有限公司','2f2a94c8-c23c-4e8a-98b3-c32a9b0487f7',0,'6d43b831-6119-46d2-9518-f7c9ed6fe39c')
2021-04-06 03:25:22,237 [46840] ERROR ASP.global_asax - time:0ms 客户端信息:Ip:116.238.55.21, 173.131.245.61 浏览器:Chrome 版本:68 操作系统:WinNT服务端错误信息:
页面:http://www.A.com:803/dbapp_53475dbapp_e524534.php
错误源:System.Web.Mvc
堆栈跟踪:at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

FileBeat配置:

max_procs: 2
queue:mem:events: 2048flush.min_events: 2048
# ============================== Filebeat inputs ===============================filebeat.inputs:# 管理系统 
- type: logenabled: trueencoding: GB2312paths:- D:/IIS/www.A.com/logs/*.txtmultiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}'multiline.negate: truemultiline.match: afterfields:topic: 'dlbZcZGBSyslogs'fields_under_root: true# 单位系统 
- type: logenabled: trueencoding: GB2312paths:- D:/IIS/www.B.com/logs/*.txt### Multiline optionsmultiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}'multiline.negate: truemultiline.match: afterfields:topic: 'dlbZcDWSyslogs'fields_under_root: true# 个人系统  
- type: logenabled: trueencoding: GB2312paths:- D:/IIS/www.C.com/logs/*.txt### Multiline optionsmultiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}'multiline.negate: truemultiline.match: afterfields:topic: 'dlbZcMySyslogs'fields_under_root: true# 调试输出
#output.console:
#   pretty: true
#output.file:
#  path: "D:/bigData"
#  filename: filebeat.log# -------------------------------- Kafka Output --------------------------------
output.kafka:# Boolean flag to enable or disable the output module.enabled: truehosts: ["192.168.1.10:9092"]# The Kafka topic used for produced events. The setting can be a format string# using any event field. To set the topic from document type use `%{[type]}`.topic: '%{[topic]}'# Authentication details. Password is required if username is set.#username: ''#password: ''# The number of concurrent load-balanced Kafka output workers.worker: 2max_message_bytes: 10000000# ================================= Processors =================================
processors:- add_host_metadata:when.not.contains.tags: forwarded- add_cloud_metadata: ~- add_docker_metadata: ~- add_kubernetes_metadata: ~- script:lang: javascriptid: my_filtertag: enablesource: >function process(event) {var str = event.Get("message");var sp = str.split(" "); var log_datetime = sp.slice(0,2).join(" ");var regEx = /^\d{4}-\d{2}-\d{2}$/;var prefix_date = log_datetime.substring(0, 10);if(prefix_date.match(regEx) != null){event.Put("server","221");log_datetime = log_datetime.replace(",",".");log_datetime = log_datetime.replace("'","");regEx = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3}$/;if(log_datetime.match(regEx) != null){event.Put("log_datetime",log_datetime);event.Put("log_index",sp.slice(2,3).join(" ").replace("[","").replace("]",""));event.Put("log_level",sp.slice(3,4).join(" "));if(str.match(/(?<=time:)\S*(?=ms)/)!=null){var spTime= str.split("time:");var spPre = spTime[0].split(" ");var spNext = spTime[1].split(" ");                    event.Put("log_class",spPre.slice(4).join(" ")); var log_execTime= spNext.slice(0,1).join(" ").replace("ms","");regEx = /^(\-|\+)?\d+(\.\d+)?$/;if(regEx.test(log_execTime)){event.Put("log_execTime",log_execTime);}else{event.Put("log_execTime","-1");}event.Put("log_message",spNext.slice(1).join(" "));}else{event.Put("log_class",sp.slice(4,5).join(" "));event.Put("log_execTime","-1");event.Put("log_message",sp.slice(6).join(" "));}return;}}event.Cancel();}- drop_fields:fields: ["@timestamp", "message", "host", "ecs", "agent", "@metadata", "log", "input"]

以上的配置说明:

  max_procs:设置可以同时执行的最大CPU数;

  queue :内部队列信息;

  Filebeat inputs:日志数据源采集的入口;

  其他字段如下说明:

#日志类型
- type: log        
#开启enabled: true
#编码格式,有中文必须设置encoding: GB2312
#路径paths:- D:/IIS/www.A.com/logs/*.txt
#多行匹配前缀multiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}'
#开启多行匹配multiline.negate: true
#开启多行之后,匹配是合并到上一条信息multiline.match: after
#增加一个字段,用于kafka的topic的识别fields:topic: 'dlbZcZGBSyslogs'
# 字段增加在输出json的根目录下fields_under_root: true//https://www.cnblogs.com/EminemJK/p/15165961.html

        Kafka Output:kafka的配置信息,主要是  topic: '%{[topic]}' 的设置,因为这里采集多个数据源,对于不同的topic,在数据源输入的时候,已经设置好字段如 topic: 'dlbZcZGBSyslogs' ,所以此处使用占位符灵活设置;

  Processors:配置处理器,即对采集的日志信息进行处理,处理是按行处理,当字符串处理即可,可以使用js语法进行对字符串进行处理;Filebeat的处理器可以多种多样,具体可以看文档。

另外,在调试的时候,可以采用文件输出或Console输出来观察处理后输出的数据格式,再进行微调:

output.file:path: "D:/bigData"filename: filebeat.log

        IIS的日志也差不多,只是微调处理逻辑就可以了,一通百通。

        其他配置可以参考官网文档:

https://www.elastic.co/guide/en/beats/filebeat/current/index.html

Kafka配置

Kafka没有特别的处理,在这里只是进行消息的接收,新建好主题就可以。

//个人系统
bin/kafka-topics.sh --create --zookeeper 192.168.1.10:2181 --replication-factor 1 --partitions 3 --topic dlbZcMySyslogs
//单位系统
bin/kafka-topics.sh --create --zookeeper 192.168.1.10:2181 --replication-factor 1 --partitions 3 --topic dlbZcDWSyslogs
//管理系统
bin/kafka-topics.sh --create --zookeeper 192.168.1.10:2181 --replication-factor 1 --partitions 3 --topic dlbZcZGBSyslogs

        partitions 分区数的大小,取决设置了多少个消费者,这里我们有三台服务器做了Clickhouse的集群作为消费者,所以分区数设置为3,一般情况,消费者总数不应该大于分区数,每个分区只能分配一个消费者。

Clickhouse配置

  Clickhouse三个分片的集群,如果你是单机的,只需要把语法相应的修改一下即可。

  在每台服务器上创建kafka引擎表:

CREATE TABLE kafka_dlb_ZC_My_syslogs (log_datetime DateTime64,log_index String,log_level String,log_class String,log_message String,log_execTime Float32,server String) ENGINE = KafkaSETTINGS kafka_broker_list = '192.168.1.10:9092',kafka_topic_list = 'dlbZcMySyslogs',kafka_group_name = 'dlbZcMySyslogs_sys',kafka_format = 'JSONEachRow',kafka_num_consumers = 1;

        创建实体表:

CREATE TABLE dlb_ZC_My_syslogs on cluster cluster_3s_1r(log_datetime DateTime64,log_index String,log_level String,log_class String,log_message String,log_execTime Float32,server String) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/dlb_ZC_My_syslogs', '{replica}')ORDER BY toDate(log_datetime)PARTITION BY toYYYYMM(log_datetime);//https://www.cnblogs.com/EminemJK/p/15165961.html

  实体表是使用集群来创建的,如果是单机请删除

 on cluster cluster_3s_1r ,并修改表引擎即可。如果已经开启了zookeeper且开启复制表,在任一一台服务器运行运行一次即可。

   在每台服务器上创建物化视图:

 CREATE MATERIALIZED VIEW viem_dlb_ZC_My_syslogs_consumer TO dlb_ZC_My_syslogsAS SELECT *FROM kafka_dlb_ZC_My_syslogs;

        创建分布式视图(可选,单机请忽略):

CREATE TABLE Dis_dlb_ZC_My_syslogs ON CLUSTER cluster_3s_1rAS LogsDataBase.dlb_ZC_My_syslogsENGINE = Distributed(cluster_3s_1r, 'LogsDataBase',  'dlb_ZC_My_syslogs',rand());

        分布式表将聚合集群中每个分片的表信息,进行执行一次。

运行

  顺便提供一个快速运行Filebeat和卸载的bat脚本:

  运行服务:

//windows server2008以上版本的服务器
cd %~dp0
.\install-service-filebeat.ps1
pause//windows server 2008 和以下的服务器cd %~dp0PowerShell.exe -ExecutionPolicy RemoteSigned -File .\install-service-filebeat.ps1pause

     卸载服务:

//windows server2008以上版本的服务器
cd %~dp0
.\uninstall-service-filebeat.ps1
pause//windows server2008和以下版本的服务器
cd %~dp0
PowerShell.exe -ExecutionPolicy RemoteSigned -File .\uninstall-service-filebeat.ps1
pause

运行之后,在任务管理器中,将服务设置为运行即可。

  查看分布式数据:

数据采集完毕,完美。

  既然数据已经有了,数据可视化方面可以采用多种方式了,以Grafana为例:

 最后

  下班,周末愉快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux引导时输入特殊信息的含义

linux引导时输入特殊信息的含义&#xff1a;通常只有在缺省模式失败&#xff08;屏幕一片混乱或者安装到某个阶段无法进行下去&#xff09;的情况下会尝试这些模式。 对于一些支持的其他模式&#xff0c;参考文件/usr/share/doc/anaconda*/command-line.txt&#xff08;如果安装…

ActionContext和ActionSupport的学习

2019独角兽企业重金招聘Python工程师标准>>> ActionContext和ActionSupport的学习 1.ActionContext中有众多的定义好的常量&#xff0c;就像是Constant类中定义的常量&#xff1b;诸如&#xff1a;session、Application、actionInvocation、Container等&#xff1b;…

中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...

我们在用word写资料时&#xff0c;比如论文、数据分析、报告等&#xff0c;经常需要插入一些公式&#xff0c;这些公式会含有一些特殊符号&#xff0c;比如根号、分式、求和等&#xff0c;这些特殊符号是不能直接用输入法来完成的&#xff0c;需要借助于word扩展的功能来帮助我…

6、struts.properties配置详解

在Struts2的核心包中org\apache\struts2文件夹下可以找到Struts2的一个默认配置文件default.properties。有时为了调试方便我们可以更改部分默认内容。具体的方法是在工程的WEB-INF/classes文件夹下简历一个struts.properties文件&#xff0c;并将要修改的信息配置到该文件中 s…

菲尔兹奖第一华人!从抓虾仔到哈佛终身教授,他年少成名,获奖无数,造福我国数学教育数十年...

全世界只有3.14 % 的人关注了爆炸吧知识在数学界有这么一个人&#xff0c;他有着“数学天才”、“科学大师”、数学王国的“凯撒大帝”等一众称号。就连国际数学大师、阿贝尔奖获得者辛格都这样评价他说&#xff1a;“即使在哈佛&#xff0c;他一个人就是一个数学系&#xff01…

关于string

string是一种很特殊的数据类型&#xff0c;它既是基元类型又是引用类型&#xff0c;在编译以及运行时&#xff0c;.Net都对它做了一些优化工作。  一&#xff0e;恒定的字符串要想比较全面的了解stirng类型&#xff0c;首先要清楚.Net中的值类型与引用类型。在C#中&#xff0…

python第七天--字符串的方法与注释

capitalize() 把字符串的第一个字符改为大写casefold() 把整个字符串的所有字符改为小写center(width) 将字符串居中&#xff0c;并使用空格填充至长度width的新字符串count(sub[,start[,end]]) 返回sub在字符串里边出现的次数&#xff0c;start和end参数表示范围&#xff…

android的热点分配ip_Android 得到连接热点的ip的方法

下面给大家介绍Android 得到连接热点的ip的方法 &#xff0c;具体代码如下所示&#xff1a;WifiManager wifiManager (WifiManager) this.getSystemService(Context.WIFI_SERVICE);if (!wifiManager.isWifiEnabled()) {System.out.println("");wifiManager.setWifiE…

【SQL基础】T-SQL函数类型——元数据函数

一般来说&#xff0c;元数据函数返回的是有关指定数据库和数据对象的信息。下面介绍几种元数据函数。 1、COL_NAME(tab_id,col_id)&#xff0c;返回表tab_id的tab_id的列名。 例&#xff1a;selectCOL_NAME(OBJECT_ID(employees),3); 结果为’FirstName’ 2、COLUMNPROPERTY(id…

为什么我们总是忍不住要刷微信?

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

22、多进程和多线程

 Android进程简介 Android会启动一个LINUX进程和一个主线程。默认的情况下,所 有该程序的组件都将在该进程中运行。当启动应用程序时,Linux会为每 一个程序单独分配一个进程,该进程默认只拥有一个主线程。 组件可以运行在当前进程中,也可以运行在其他进程中。组件运行在 哪个…

Docker小白到实战之常用命令演示,通俗易懂

前言上一篇大概认识了Docker&#xff0c;主要是从概念、架构、优点及流程方面进行阐述&#xff0c;并进行安装和体验&#xff1b;接下来就开始进行实操学习&#xff0c;在演示过程中会针对关键的知识点进行归纳和总结&#xff0c;这里先从常用命令说起&#xff0c;来吧&#xf…

lumen 配置数据库结果自动转数组_lumen 数据库操作 Cannot use object of type stdClass as array...

你可能记得&#xff0c;操作数据库时$dataList 什么什么 ->get();能查询到数据 数据结果为数组加stdClass类型你使用 $dataList $dataList->toArray();进行数据转化结果你发现&#xff0c;没有正确转化,你再到里面去转化&#xff0c;但结果证明也是徒劳foreach ($allDa…

今天这个日子,大多数人都不知道…

全世界只有3.14 % 的人关注了爆炸吧知识我是蝙蝠&#xff0c;身体虽小五毒俱全你确定要尝吗&#xff1f;我是果子狸&#xff0c;人们一度“谈我色变”但如今又被端上餐桌&#xff01;我是野兔&#xff0c;人们说我很可爱我的肉却变成“野味”毛发变成皮草……今天&#xff0c;世…

PostgreSQL表的行数统计

PostgreSQL表的行数统计 在很多情况下我们需要知道一个表的记录数有多少。如果你发现你有这样的需求&#xff0c;你还应该问问这样的统计的精确度到底又多高。如果你在做会计报表&#xff0c;你需要非常的精确。如果你做一个网页的记数器&#xff0c;可能有一些误差也是允许的…

SharePoint at .NET技术大会

在这个月上海举行的.NET技术大会上&#xff0c;我将奉献一节名为《基于SharePoint的Web应用开发模型》的课程。由于大会的定位是“面向企业级.NET开发深度应用”&#xff0c;我相信大家想听的一定不是单纯的介绍SharePoint Server&#xff0c;或是怎么做一个Web Part。思来想去…

对DDD的常见误区

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「205」篇原创敬上大家好&#xff0c;我是Z哥。我从 2014 年开始接触 DDD 到现在也有 7 年多时间了&#xff0c;在这个期间踩过很多坑&#xff0c;也是自己慢慢从充…

Python办公自动化Day2-openpyxl

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;常规操作添加数据遍历所有单元格数据合并/取消合并单元格添加/删除行与列移动指定范围单元格 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 Python办公自动化自学笔记知识…

vsftpd服务

实验1VSFTPD实验环境在虚拟机Linux 6.5系统下需要2台Linux系统一台A作为服务端一条B作为测试客户端开启2台Linux系统。实验目标A作为服务端配置VSFTPD服务器实现FTP服务。B作为测试客户端验证服务器A的共享是否有效。配置真实主机确保真实主机能ping通2台虚拟机。实验步骤1. 首…

传递函数_使用python计算麦克风阵列信号的传递函数

使用python写了一个测试麦克风阵列传递函数的demo&#xff0c;有需要的自取。该代码使用了第三方库ThinkDSP。1. 传递函数首先解释下什么是传递函数&#xff1a;把具有线性特性的对象的输入与输出间的关系&#xff0c;用一个函数(输出波形的拉普拉斯变换与输入波形的拉普拉斯变…