当前位置:   article > 正文

Elasticsearch+Logstash+Kibana日志采集服务搭建并简单整合应用_elasticsearch logstash kibana

elasticsearch logstash kibana

ELK简介

ELK是Elasticsearch+Logstash+Kibana的简称

Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在是使用最广的开源搜索引擎之一。

Logstash 简单来说就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端,与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供了很多功能强大的滤网以满足你的各种应用场景。

Kibana 是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图标、表格、地图等,kibana能够很轻易的展示高级数据分析与可视化。

软件版本


CentOS-7-x86_64
JAVA8
elasticsearch-7.7.0-x86_64
logstash-7.7.0
kibana-7.7.0-x86_64


准备工作


关闭安全策略


这个一定要关闭 关闭 关闭,重要的事说三遍,至于为什么不知道,反正不关闭我没有安装成功。。。。。

查看Selinux状态

  1. [root@lijl ~]# sestatus
  2. SELinux status: enabled
  3. SELinuxfs mount: /sys/fs/selinux
  4. SELinux root directory: /etc/selinux
  5. Loaded policy name: targeted
  6. Current mode: enforcing
  7. Mode from config file: enforcing
  8. Policy MLS status: enabled
  9. Policy deny_unknown status: allowed
  10. Max kernel policy version: 28


关闭Selinux
这个很简单就是将config文件中的SELinux对应的值修改成disabled,保存重启。

  1. [root@lijl etc]# cd /etc/selinux/
  2. [root@lijl selinux]# vim config
  3. # This file controls the state of SELinux on the system.
  4. # SELINUX= can take one of these three values:
  5. # enforcing - SELinux security policy is enforced.
  6. # permissive - SELinux prints warnings instead of enforcing.
  7. # disabled - No SELinux policy is loaded.
  8. SELINUX=disabled
  9. # SELINUXTYPE= can take one of three two values:
  10. # targeted - Targeted processes are protected,
  11. # minimum - Modification of targeted policy. Only selected processes are protected.
  12. # mls - Multi Level Security protection.
  13. SELINUXTYPE=targeted


下载ELK的RPM安装包

wget下载,若下载不下来,可复制链接通过迅雷之类的下载器下载。

  1. https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm
  2. https://artifacts.elastic.co/downloads/kibana/kibana-7.7.0-x86_64.rpm
  3. https://artifacts.elastic.co/downloads/logstash/logstash-7.7.0.rpm

如下报错可以在后面加:--no-check-certificate

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-x86_64.rpm --no-check-certificate



下载好后可建一个文件夹将这个三个安装包放在一起,方便后面查找安装

安装Elasticsearch


安装

[root@lijl elk]# rpm --install elasticsearch-7.7.0-x86_64.rpm


出现下面这些说明安装成功

  1. warning: elasticsearch-7.7.0-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
  2. Creating elasticsearch group... OK
  3. Creating elasticsearch user... OK
  4. ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
  5. sudo systemctl daemon-reload
  6. sudo systemctl enable elasticsearch.service
  7. ### You can start elasticsearch service by executing
  8. sudo systemctl start elasticsearch.service
  9. future versions of Elasticsearch will require Java 11; your Java version from [/var/jdk1.8.0_281/jre] does not meet this requirement
  10. Created elasticsearch keystore in /etc/elasticsearch/elasticsearch.keystore


启动
跟着安装日志中的提示一顿撸进行了

设置开启启动

  1. [root@lijl elk]# systemctl daemon-reload
  2. [root@lijl elk]# systemctl enable elasticsearch


启动Elasticsearch

[root@lijl elk]# systemctl start elasticsearch


查看Elasticsearch运行状态

[root@lijl elk]# systemctl status elasticsearch


查看Elasticsearch的配置文件

  1. [root@lijl elk]# rpm -qc elasticsearch
  2. /etc/elasticsearch/elasticsearch.yml
  3. /etc/elasticsearch/jvm.options
  4. /etc/elasticsearch/log4j2.properties
  5. /etc/elasticsearch/role_mapping.yml
  6. /etc/elasticsearch/roles.yml
  7. /etc/elasticsearch/users
  8. /etc/elasticsearch/users_roles
  9. /etc/init.d/elasticsearch
  10. /etc/sysconfig/elasticsearch
  11. /usr/lib/sysctl.d/elasticsearch.conf
  12. /usr/lib/systemd/system/elasticsearch.service


这一步可有可无,主要针对第一次安装的,该操作可知道文件有哪些以及位置,方便后续修改

查看端口使用情况

  1. [root@lijl elk]# netstat -nltp
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
  5. tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1507/dnsmasq
  6. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1144/sshd
  7. tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1141/cupsd
  8. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1387/master
  9. tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2951/sshd: root@pts
  10. tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 3900/sshd: root@pts
  11. tcp6 0 0 :::111 :::* LISTEN 1/systemd
  12. tcp6 0 0 127.0.0.1:9200 :::* LISTEN 3622/java
  13. tcp6 0 0 ::1:9200 :::* LISTEN 3622/java
  14. tcp6 0 0 127.0.0.1:9300 :::* LISTEN 3622/java
  15. tcp6 0 0 ::1:9300 :::* LISTEN 3622/java
  16. tcp6 0 0 :::22 :::* LISTEN 1144/sshd
  17. tcp6 0 0 ::1:631 :::* LISTEN 1141/cupsd
  18. tcp6 0 0 ::1:25 :::* LISTEN 1387/master
  19. tcp6 0 0 ::1:6010 :::* LISTEN 2951/sshd: root@pts
  20. tcp6 0 0 ::1:6011 :::* LISTEN 3900/sshd: root@pts


为什么要查看,因为我不想关闭防火墙,通过这一步方便我知道应该开放哪些端口

开放9200和9300端口

  1. [root@lijl elk]# firewall-cmd --permanent --add-port={9200/tcp,9300/tcp}
  2. success
  3. [root@lijl elk]# firewall-cmd --reload
  4. success
  5. [root@lijl elk]# firewall-cmd --list-all
  6. public (active)
  7.   target: default
  8.   icmp-block-inversion: no
  9.   interfaces: ens32
  10.   sources: 
  11.   services: ssh dhcpv6-client
  12.   ports: 9200/tcp 9300/tcp
  13.   protocols: 
  14.   masquerade: no
  15.   forward-ports: 
  16.   source-ports: 
  17.   icmp-blocks: 
  18.   rich rules: 
  19.     
  20. [root@lijl elk]


以上都做完后可通过CURL访问一下试试

  1. [root@lijl selinux]# curl http://127.0.0.1:9200
  2. {
  3.   "name" : "lijl.com",
  4.   "cluster_name" : "elasticsearch",
  5.   "cluster_uuid" : "2F64hc_lRPGcX9-qGqIfWw",
  6.   "version" : {
  7.     "number" : "7.7.0",
  8.     "build_flavor" : "default",
  9.     "build_type" : "rpm",
  10.     "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
  11.     "build_date" : "2020-05-12T02:01:37.602180Z",
  12.     "build_snapshot" : false,
  13.     "lucene_version" : "8.5.1",
  14.     "minimum_wire_compatibility_version" : "6.8.0",
  15.     "minimum_index_compatibility_version" : "6.0.0-beta1"
  16.   },
  17.   "tagline" : "You Know, for Search"
  18. }
  19. [root@lijl selinux]


安装Kibana


安装

  1. [root@lijl elk]# rpm --install kibana-7.7.0-x86_64.rpm
  2. warning: kibana-7.7.0-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
  3. [root@lijl elk]#

设置开机自启动

  1. [root@lijl elk]#
  2. [root@lijl elk]# systemctl daemon-reload
  3. [root@lijl elk]# systemctl enable kibana
  4. Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.


修改配置文件

  1. [root@lijl elk]# rpm -qc kibana
  2. /etc/kibana/kibana.yml
  3. [root@lijl elk]# vim /etc/kibana/kibana.yml


配置如下,如果打开yml不想找对应的属性,可将yml中的内容清空将下面这几行Copy进去保存退出即可,将kibana与es连接起来。

  1. server.port: 5601
  2. server.host: "0.0.0.0"
  3. elasticsearch.hosts: ["http://localhost:9200"]


启动Kibana

  1. [root@lijl elk]# systemctl start kibana
  2. [root@lijl elk]
  3. [root@lijl elk]# systemctl status kibana


开放5601端口
如果的你防火墙已经关闭了,开放端口这步是可以忽略的

  1. [root@lijl elk]# firewall-cmd --zone=public --permanent --add-port=5601/tcp
  2. success
  3. [root@lijl elk]# firewall-cmd --reload
  4. success
  5. [root@lijl elk]# firewall-cmd --list-all
  6. public (active)
  7.   target: default
  8.   icmp-block-inversion: no
  9.   interfaces: ens32
  10.   sources: 
  11.   services: ssh dhcpv6-client
  12.   ports: 9200/tcp 9300/tcp 5601/tcp
  13.   protocols: 
  14.   masquerade: no
  15.   forward-ports: 
  16.   source-ports: 
  17.   icmp-blocks: 
  18.   rich rules: 
  19.     
  20. [root@lijl elk]


上面的步骤都完成后,可以浏览器访问一下Kibana:http://localhost:5601/

打开Dev Tools,可以直接操作连接的es。


安装Logstash


安装

  1. [root@lijl elk]# rpm -ivh logstash-7.7.0.rpm
  2. Preparing...                          ################################# [100%]
  3. Updating / installing...
  4.    1:logstash-1:7.7.0-1               ################################# [100%]
  5. Using provided startup.options file: /etc/logstash/startup.options
  6. /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.31/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated
  7. Successfully created system startup script for Logstash
  8. [root@lijl elk]


设置Logstash开机自启动

  1. [root@lijl elk]# systemctl daemon-reload
  2. [root@lijl elk]# systemctl enable logstash
  3. Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.


启动Logstash

  1. [root@lijl elk]
  2. [root@lijl elk]# systemctl start logstash
  3. [root@lijl elk]


查看运行状态

[root@lijl logstash]# systemctl status logstash.service 

如果启动失败,可以去查看日志:/var/log/logstash

遇到的报错:

很明显他提示你的JAVA_HOME找不到, 然后我们来看看自己有没有配置JAVA_HOME呢,使用echo $JAVA_HOME,返回我们配置的。
显然我们配置了的,但是!注意了,本人的jdk是通过解压包安装的,而不是yum安装的,那么有什么不同呢? 我们看下为什么会报这个错。

找到路径为 /usr/share/logstash/bin/下的 logstash.lib.sh文件,注意这里

也就是说当你通过systemctl start logstash命令行去启动logstash时,他会默认从$JAVA_HOME/bin/java去读取,如果你通过解压包安装,你配置的JAVA_HOME没能被logstash读取到,所以报错了。这里笔者没有研究为何自己配置的JAVA_HOME不生效,也没有测试yum安装jdk的话是否有这个问题。

问题找到了,那么解决问题也简单。直接在这个配置文件中加上一行配置JAVA_HOME="你自己安装的jdk路径 如 /usr/src/java" 然后重启就行了。

成功启动,到这里ELK大致就已经搭建完成了。接下来就结合一个简单的web程序,将运行日志收集到ELK中分析

整合SpringBoot


创建收集配置


为方便理解,我就直接再/etc/logstash/conf.d目录下创建一个logstash-springboot.conf配置文件

[root@lijl conf.d]# vim logstash-springboot.conf 
  1. input {
  2.   tcp {
  3.     port => 4560
  4.     codec => json_lines
  5.   }
  6. }
  7. output {
  8.   elasticsearch {
  9.     hosts => "localhost:9200"
  10.     index => "springboot-logstash-%{+YYYY.MM.dd}"
  11.   }
  12. stdout{codec => rubydebug}


简单解释一下配置

  • inport是日志采集输入,output是日志输出,这里是输出到es。
  • inport 端口默认4560,可自定义。端口再整合程序时需对应logback.xml日志配置文件里appender中的destination
  • codec 数据格式 json_lines是json解析插件,有些版本的logstash需要单独安装,目前我安装的这个版本中已经有了,所有就不介绍怎么安装了,没有请自行百度安装logstash-codec-json_lines插件教程
  • output 配置的是ES的基础信息与日志文件索引
  • stdout 控制台打印,这个可忽略,为了掩饰先加上方便看效果

配置完成后,我们先关闭logstash服务,手动启动logstash并指定加载该配置,一定要先停掉logstash服务

启动:

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-springboot.conf

启动后logstash会在es上创建一个保存日志的模板。

如果有如下报错,原因为配置文件第一行第一列必须要以下来开头,需要检查一下配置文件,必要时先创建好再上传到服务器: “#”, “input”, “filter”, “output”

“LogStash::ConfigurationError”, :message=>“Expected one of [ \t\r\n], “#”, “input”, “filter”, “output” at line 1, column 1 (byte 1)”, 


创建一个SpringBoot项目


创建过程就不截下来了,就是一普通的SpringBoot项目,因为需要将日志推送给logstash服务所以需要加一个logstash依赖

  1. <!--集成logstash-->
  2. <dependency>
  3. <groupId>net.logstash.logback</groupId>
  4. <artifactId>logstash-logback-encoder</artifactId>
  5. <version>4.11</version>
  6. </dependency>


创建logback日志配置文件,配置文件与平时创建的也是一模一样,唯一不一样的就是多加了一个LogstashTcpSocketAppender用于连接Logstash将日志推送至Logstash上

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration>
  3. <configuration>
  4.     <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
  5.     <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
  6.     <!--应用名称-->
  7.     <property name="APP_NAME" value="springboot-logstash-examples"/>
  8.     <!--日志文件保存路径-->
  9.     <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
  10.     <contextName>${APP_NAME}</contextName>
  11.     <!--每天记录日志到文件appender-->
  12.     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  13.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  14.             <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
  15.             <maxHistory>30</maxHistory>
  16.         </rollingPolicy>
  17.         <encoder>
  18.             <pattern>${FILE_LOG_PATTERN}</pattern>
  19.         </encoder>
  20.     </appender>
  21.     <!--输出到logstash的appender-->
  22.     <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
  23.         <!--可以访问的logstash日志收集端口-->
  24.         <destination>192.168.78.128:4560</destination>
  25.         <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
  26.     </appender>
  27.     <root level="INFO">
  28.         <appender-ref ref="CONSOLE"/>
  29.         <appender-ref ref="FILE"/>
  30.         <appender-ref ref="LOGSTASH"/>
  31.     </root>
  32. </configuration>

项目中打印日志:

回到服务器上看下logstash控制台的打印

可以看到,已经打印出来了,并且通过json_lines插件已经数据格式化成json了,并且输出到es进行了保存。这时其实是已经可以在Kibana中看到了,回来Kibana,管理界面,创建索引。

logstash启动时已经创建了,这里创建索引模式,将索引与logstash创建的关联起来。

来到Discover,选择索引,可以填写查询条件和时间段进行查询。

数据可以json格式展示

grok配置

grok介绍

        前面整合Spingboot项目,生成的es字段是固定的,我们打印的日志也都在message字段里,如果需要新增字段存取其他信息,比如项目名,操作的动作,操作人等。

        使用grok可以将一段日志,根据规则解析出不同的值并赋值给指定的字段。

        例如:

handler$$sendMail$$发送邮箱:124@qq.com,发送成功

        日志用$$隔开了三个值,第一个值我们定义为项目名model,第二个定义为方法名action,第三个定义为真正的日志message,

        使用grok解析:%{DATA:model}\$\$%{DATA:action}\$\$%{GREEDYDATA:message]

我们可以在Kibana上Dev Tools的Grok Debugger工具进行验证,看到成功解析出了字段。

grok配置

logstash配置文件中加上grok配置,重新启动

  1. filter {
  2. grok {
  3. match" => "&{DATA:model}\$\$&{DATA:action}\$\$&{GREEDYDATA:message}"
  4. }
  5. }

打印日志

写一个打印日志工具类,定义model,action,message,打印日志时传入。将三者中间用grok配置的特定格式连接$$

  1. package com.example.demo.util;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. /**
  5. * 日志工具类。
  6. * logger打印日志就会发送给logstash,可以将message里的内容系分便于查询日志,
  7. * 使用$$将所有字段链接起来,在logstash配置中,也使用$$将日志切分开
  8. *
  9. * @author admin
  10. * @date 2024-05-30
  11. */
  12. public class LogUtils {
  13. /**
  14. * 主日志
  15. */
  16. private static final Logger logger = LoggerFactory.getLogger(LogUtils.class);
  17. /**
  18. * 输出日志-info
  19. *
  20. * @param model 行为可放方法名称等
  21. * @param action 可放订单号,请求参数等关键信息
  22. * @param message 日志详情
  23. */
  24. public static void outLogInfo(String model, String action, String message) {
  25. logger.info(join(model, action, message));
  26. }
  27. /**
  28. * 输出日志-error
  29. * @param model
  30. * @param action
  31. * @param message
  32. */
  33. public static void outLogError(String model, String action, String message) {
  34. logger.error(join(model, action, message));
  35. }
  36. private static String join(String model, String action, String msg) {
  37. return convertNullString(model) + "$$" + convertNullString(action) + "$$" + msg;
  38. }
  39. private static String convertNullString(String s) {
  40. return s == null ? "" : s;
  41. }
  42. }

可以看到日志中就有了 新增的字段,

本人根据其他人的文档操作成功,并补充了一些内容,和自己遇到的问题与解决方法。

原文链接:https://blog.csdn.net/lijialexiao/article/details/115656600

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/994962
推荐阅读
相关标签
  

闽ICP备14008679号