海量日志下的日志架构优化:filebeat+logstash+kafka+elk(代码片段)

author author     2023-02-12     331

关键词:

前言:

实验需求说明

在前面的日志收集中,都是使用的filebeat+ELK的日志架构。但是如果业务每天会产生海量的日志,就有可能引发logstash和elasticsearch的性能瓶颈问题。因此改善这一问题的方法就是filebeat+logstash+kafka+ELK,
也就是将存储从elasticsearch转移给消息中间件,减少海量数据引起的宕机,降低elasticsearch的压力,这里的elasticsearch主要进行数据的分析处理,然后交给kibana进行界面展示

实验架构图:

技术分享图片

实验部属拓扑图:

整个过程是由filebeat收集本机日志——logstash(或集群)进行过滤处理——传送给kafka(或集群)进行存储——ELK工具之logstash再到kafka中获取数据——传给elk工具之elasticsearch分析处理——交给kibana展示。
这里部属的两个logstash扮演的角色和功能是不一样的。
因为实验机器是虚拟机,内存小,因此使用了四台机器,部属分布如下(试验机的内存最好在4G以上):
技术分享图片

实验步骤

1、test101服务器部属tomcat并生成json格式日志

1.1 在test101服务器安装jdk+apachetomcat

jdk安装步骤省略,tomcat下载好安装包,解压即可。

1.2 修改tomcat配置,使之产生json格式日志

修改tomcat的配置文件/usr/local/apache-tomcat-9.0.14/conf/server.xml,注释掉原来的内容(大概在160行):


<!--        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />   
-->

然后添加新的内容:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".log"
pattern=""clientip":"%h","ClientUser":"%l","authenticated":"
%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"
%b","Query?string":"%q","partner":"%Refereri","AgentVersion":"%User-Agenti"" />

1.3 重启tomcat,访问10.0.0.101:8080

查看日志已经变成了json格式:

[[email protected] logs]# tailf tomcat_access_log.2018-12-23.log 

"clientip":"10.0.0.1","ClientUser":"-","authenticated":" -","AccessTime":"[23/Dec/2018:16:01:35 -0500]","method":"GET / HTTP/1.1","status":"200","SendBytes":" 11286","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

1.4 创建elk的yum文件,安装filebeat

[[email protected] ~]# cat /etc/yum.repos.d/elk.repo 
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
[[email protected] ~]# 

[[email protected] ~]# yum -y install filebeat

修改配置文件/etc/filebeat/filebeat.yml如下(去掉已经注释的内容,还剩下这面一部分:)
这里要手动改配置,不能清空文件直接粘贴下面的配置!
这里要手动改配置,不能清空文件直接粘贴下面的配置!
这里要手动改配置,不能清空文件直接粘贴下面的配置!

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/apache-tomcat-9.0.14/logs/tomcat_access_log*     #日志路径
  json.keys_under_root: true     #这两行是为了保证能传送json格式的日志
  json.overwrite_keys: true
#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: $path.config/modules.d/*.yml
  reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
  index.number_of_shards: 3
#============================== Kibana =====================================
setup.kibana:
#----------------------------- Logstash output --------------------------------
output.logstash:
  hosts: ["10.0.0.103:5044"]
#================================ Procesors =====================================
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

启动filebeat

[[email protected] ~]# systemctl start filebeat

2、test103服务器部属logstash+kafka

2.1 部属jdk+zookeeper+kafka

1)jdk部属省略

2)zookeeper安装:

[[email protected] ~]# tar xf zookeeper-3.4.13.tar.gz -C /usr/local/
[[email protected] conf]# cd /usr/local/zookeeper-3.4.13/conf/
[[email protected] conf]# mv zoo_sample.cfg zoo.cfg 
[[email protected] conf]# cd ../bin/
[[email protected] bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[[email protected] bin]# netstat -tlunp|grep 2181
tcp6       0      0 :::2181                 :::*                    LISTEN      18106/java          
[[email protected] bin]# 

3)kafka安装:

[[email protected] ~]# tar xf kafka_2.12-2.1.0.tgz 
[[email protected] ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
[[email protected] ~]# cd /usr/local/kafka/config/

修改server.properties,修改了两个地方:

listeners=PLAINTEXT://10.0.0.103:9092
zookeeper.connect=10.0.0.103:2181

启动kafka

[[email protected] config]# nohup  /usr/local/kafka/bin/kafka-server-start.sh  /usr/local/kafka/config/server.properties >/dev/null 2>&1 &
[[email protected] config]# netstat -tlunp|grep 9092
tcp6       0      0 10.0.0.103:9092         :::*                    LISTEN      17123/java          

2.2、部属logstash

1)同test101一样,创建elk的yum文件:

[[email protected] ~]# cat /etc/yum.repos.d/elk.repo 
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
[[email protected] ~]# 

2)部属服务,修改配置

[[email protected] ~]# yum -y install logstash

修改/etc/logstash/logstash.yml文件下面几项内容:

path.data: /var/lib/logstash
 path.config: /etc/logstash/conf.d
 http.host: "10.0.0.103"    #本机IP
path.logs: /var/log/logstash

创建收集日志文件

[[email protected] ~]# cd /etc/logstash/conf.d/

创建配置文件logstash-kafka.conf,这个文件是在拿到filebeat推送过来的数据后,再推送给kafka:

[[email protected] conf.d]# cat logstash-kafka.conf 
input 
  beats 
    port => 5044
  



output 
kafka 
bootstrap_servers => "10.0.0.103:9092"     #kafka 的IP地址
topic_id => "crystal"
compression_type => "snappy"
codec => json


[[email protected] conf.d]# 

3)测试启动logstash

[[email protected] ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-kafka.conf -t
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[WARN ] 2018-12-23 14:02:59.870 [LogStash::Runner] multilocal - Ignoring the ‘pipelines.yml‘ file because modules or command line options are specified
Configuration OK
[INFO ] 2018-12-23 14:03:06.277 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
[[email protected] ~]# 

测试OK,启动logstash:

[[email protected] ~]# nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-kafka.conf >/dev/null 2>&1 &
[2] 18200
[[email protected] ~]# netstat -tlunp|grep 18200  #检查端口启动状况,OK
tcp6       0      0 :::5044                 :::*                    LISTEN      18200/java          
tcp6       0      0 127.0.0.1:9600          :::*                    LISTEN      18200/java          
[[email protected] ~]# 

3、搭建ELK工具

3.1 test102服务器搭建jdk+logstash+elasticsearch

jdk部属省略

3.2 test102服务器安装logstash

1)yum安装logstash,修改/etc/logstash/logstash.yml文件下面几项内容:

path.data: /var/lib/logstash
 path.config: /etc/logstash/conf.d
 http.host: "10.0.0.102"
path.logs: /var/log/logstash

2) 创建收集日志配置文件,这个文件是在kafka里面去拿数据,然后交给elasticsearch分析处理:

[[email protected] logstash]# cat /etc/logstash/conf.d/logstash-es.conf 
input 
kafka 
bootstrap_servers => "10.0.0.103:9092" 
topics => "crystal"
codec => "json"
consumer_threads => 5
decorate_events => true


output 
elasticsearch 
hosts => [ "10.0.0.102:9200" ]
index => "tomcat-log-%+YYYY-MM-DD"
codec => "json"


[[email protected] logstash]# 

启动服务:

[[email protected] ~]#  nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-es.conf >/dev/null 2>&1 &

3.3 test102服务器安装elasticsearch

yum安装elasticsearch,修改配置文件/etc/elasticsearch/elasticsearch.yml下面几行内容:

path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.102
http.port: 9200

启动服务:

[[email protected] config]# systemctl start elasticsearch
[[email protected] config]# netstat -tlunp|grep 9200
tcp6       0      0 10.0.0.102:9200         :::*                    LISTEN      7109/java           
[[email protected] config]# 

3.4 在test104服务器安装kibana

yum安装kibana,修改配置文件/etc/kibana/kibana.yml下面几行:

server.port: 5601
server.host: "10.0.0.104"
elasticsearch.url: "http://10.0.0.102:9200"
kibana.index: ".kibana"

启动服务

[[email protected] kibana]# systemctl start kibana
[[email protected] kibana]# netstat -tlunp|grep 5601
tcp        0      0 10.0.0.104:5601         0.0.0.0:*               LISTEN      11600/node          
[[email protected] kibana]# 

4、日志收集测试

4.1 访问tomcat:10.0.0.101:8080产生日志

访问10.0.0.101:8080后,查看kibana的索引创建界面,已经有索引tomcat-log-2018-12-357。创建索引,选择“I don‘t want to use the Time Filter”,然后查看界面数据,已经有日志了,并且是json格式:
技术分享图片

说明整个流程已经OK了。

《ELK收集Apache的json格式访问日志并按状态码绘制图表》,创建一个饼图添加到Dashboard

技术分享图片

刷新10.0.0.101:8080/dsfsdsd(界面不存在,会产生404的状态码),饼图会动态变化如下:
技术分享图片

至此,filebeat+logstash+kafka+elk架构部属完成了。

elk+filebeat+kafka+zookeeper构建海量日志分析平台

ELK+Filebeat+Kafka+ZooKeeper构建海量日志分析平台参考:http://www.tuicool.com/articles/R77fieA我在做ELK日志平台开始之初选择为ELK+Redis直接构建,在采集nginx日志时一切正常,当我采集我司业务报文日志类后,logstash会报大量的redisconnecttimeout... 查看详情

日志解决方案filebeat+redis+elk(代码片段)

日志解决方案filebeat+redis+elk系统架构图:日志采集流程:filebeat采集程序日志,并将日志发送到redis,创建对应的keylogstash从redis中获取日志,并按照对应log_source推送到elasticsearch集群中,并根据log_sourc... 查看详情

elk+filebeat+kafka+zookeeper构建海量日志分析平台(转)

参考:http://www.tuicool.com/articles/R77fieA我在做ELK日志平台开始之初选择为ELK+Redis直接构建,在采集nginx日志时一切正常,当我采集我司业务报文日志类后,logstash会报大量的redisconnecttimeout。换成rediscluster后也是同样的情况后,就考... 查看详情

elk+filebeat+kafka+zookeeper构建海量日志分析平台

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tchuairen.blog.51cto.com/3848118/1861167什么要做日志分析平台?随着业务量的增长,每天业务服务器将会产... 查看详情

filebeat导入elastaticsearch的方法(代码片段)

Filebeat导入Elastaticsearch的方法1.什么是Filebeat?到底是干什么的?Filebeat说实话,就是一个日志监控分发器,类似tail-f这样去监控某个日志,或者是某个目录下的日志文件。它会监控日志目录或者指定的日志文件,追踪读取这些文... 查看详情

filebeat采集多个目录日志

...ash的同一端口,反之应该分开,即一个日志就需要写一个filebeat配置文件+一个logstash配置文件)采集目标日志的路径:C:\\testlog\\test.log(例:2020-07-3015:05:54|INFO|Thisisatestlog13,kkkk55!)C:\\testlog1\\test1.log(例:2020-07-3014:56:30,674[112]DEBUG... 查看详情

filebeat配置日志记录(等级)(代码片段)

配置日志配置文件filebeat.yml中的logging部分包含用于配置日志记录输出的选项。日志记录系统可用将日志写入syslog,如果未明确配置日志记录,则使用文件输出。logging.level:infologging.to_files:truelogging.files:path:/var/log/filebeatname:filebeatk... 查看详情

docker安装filebeat读取日志输出到redis或者es

参考技术A1.docker安装自行百度2.filebeat:7.16.2 dockerrun-d--namefilebeat-v/Documents/filebeat/logs:/var/log/filebeat-v/Documents/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml-v .../logs/business/error.log:/var/log/error.log--privileged=trueelastic/filebeat:7.16.2斜杠... 查看详情

(19)go-micro微服务filebeat收集日志(代码片段)

目录一Filebeat介绍二FileBeat基本组成三FileBeat工作原理四Filebeat如何记录文件状态:五Filebeat如何保证事件至少被输出一次六安装Filebeat七使用Filebeatfilebeat.yml编写八最后一Filebeat介绍filebeat是Beats中的一员。  Beats在是一个轻量级日... 查看详情

filebeat同时采集多个日志

 1.filebeat配置文件:filebeat.inputs:-type:log enabled:true backoff:"1s" tail_files:false paths:  -/usr/local/nginx/logs/access-json.log fields:  filetype: 查看详情

filebeat采集nginx日志,业务日志,阿里云sms,slb日志(代码片段)

filebeat采集nginx日志,业务日志,阿里云sms,slb日志nginx日志1设置nginx日志为json模式编辑nginx.conf->log_formatmainuserroot;worker_processes4;worker_rlimit_nofile65535;error_log/var/log/nginx/error.logwar 查看详情

filebeat采集nginx日志,业务日志,阿里云sms,slb日志(代码片段)

filebeat采集nginx日志,业务日志,阿里云sms,slb日志nginx日志1设置nginx日志为json模式编辑nginx.conf->log_formatmainuserroot;worker_processes4;worker_rlimit_nofile65535;error_log/var/log/nginx/error.logwar 查看详情

海量日志收集项目总结logagent开发(代码片段)

...务器上部署logstash,比较重量级,所以演化成客户端部署filebeat的EFK,由filebeat收集向logstash中写数据,最后落地到elasticsearch,通过kibana界面进行日志检索。为什么本项目不适用ELK方案?缺点:运维成本?,每增加?个?志收集项,都... 查看详情

海量日志收集项目总结logagent开发(代码片段)

...务器上部署logstash,比较重量级,所以演化成客户端部署filebeat的EFK,由filebeat收集向logstash中写数据,最后落地到elasticsearch,通过kibana界面进行日志检索。为什么本项目不适用ELK方案?缺点:运维成本?,每增加?个?志收集项,都... 查看详情

rsyslog与journal日志架构(代码片段)

系统日志架构概述在centos7系统中有两个日志服务,分别是传统的rsyslog和新添加的systemd-journalsystemd-journal是一个改进型的日志管理服务,可以收集来自内核、系统早期的启动阶段的日志、系统守护进程在启动和运行中的标准输出... 查看详情

eflfk——elk日志分析系统+kafka+filebeat架构(代码片段)

ELFK——ELK结合filebeat日志分析系统(2)_Evens7xxX的博客-CSDN博客紧接上期,在ELFK的基础上,添加kafka做数据缓冲附kafka消息队列 nginx服务器配置filebeat收集日志:192.168.116.40,修改配置将采集到的日志转发给k... 查看详情

filebeat(代码片段)

 filebeat用于收集和转发日志。filebeat监视指定的日志文件和位置,收集日志事件,并将它们转发到es或logstash等。配置说明:input:#==============Filebeatprospectors===========filebeat.inputs:#6.3以前是filebeat.prospectors:-type:log#默认为log。6.0... 查看详情

elk做日志分析(filebeat+logstash+elasticsearch)配置(代码片段)

利用Filebeat去读取日志发送到Logstash,再由Logstash处理后发送给Elasticsearch。一、Filebeat项目日志文件:利用Filebeat去读取文件,paths下面配置路径地址,Filebeat会自动去读取/data/share/business_log/TA-*/debug.log文件#===========================Filebea... 查看详情