elk系列-elasticsearch+logstash+kibana+log4j2快速入门与搭建用例(代码片段)

yulinlewis yulinlewis     2022-12-09     678

关键词:

前言

最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录。

首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开发者日后的维护。每当客户端生产一条消息并发送到消息队列后,就会插入一条对应的记录到数据库里。当这条消息被消费之后,又会更新数据库里对应的记录的几个column的值,比如status、updated_on这些常用的column。

由于客户每天生产消费的消息很多,导致数据库里的这个表里的数据很多,长年累月下来,会达到数以亿计。领导决定不再把这些消费日志保存到数据库,而是改为通过Log4j2 + ELK架构把这些日志保存到Elasticsearch里。

ELK简介

ELk是Elasticsearch + Logstash + Kibana的缩写,ELK一般用来收集分布式架构下各个节点的日志,并进行统一地管理。

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana也是一个开源和免费的工具,Kibana可以为Logstash和ElasticSearch提供的日志分析友好的Web界面,可以帮助汇总、分析和搜索重要数据日志。

上面的官方介绍可能会比较抽象,按我个人的理解,可以简单将ELK理解为一个MVC架构的Java web应用:Elasticsearch对应M,Logstash对应C,Kibana对应V。

由于项目使用的是6.4.2版本的Elasticsearch,所以整个ELK都采用了同样的版本6.4.2。这三个软件都可以直接从官网下载到,下面是官网地址。

官方下载地址

ELK的下载安装与快速入门

本文只是基于Windows平台下,进行简单的快速入门,先搭建好ELK框架并测试通过,后续文章再记录更多的细节。

Elasticsearch 6.4.2

从官网下载了6.4.2版本的Elasticsearch的压缩版后,解压即可使用,使用默认的配置即可。

在Elasticsearch的安装目录下,进入/bin目录,可以看到有两个文件:

  1. elaticsearch
  2. elaticsearch.bat

这两个文件都可以启动Elasticsearch,暂时没发现在Windows平台下通过这两个文件启动Elasticsearch有什么不同。我一般使用没有后缀名的那个文件来启动Elasticsearch。

启动成功后,在浏览器输入127.0.0.1:9200,如果访问成功会反馈信息:


  "name" : "erwbgE5",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "QQvV3hBnSCSGsf-ycD3fng",
  "version" : 
    "number" : "6.4.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "04711c2",
    "build_date" : "2018-09-26T13:34:09.098244Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  ,
  "tagline" : "You Know, for Search"

注意,如果使用Elasticsearch5.X及以上的版本,需要使用jdk 1.8;5.X以下版本使用jdk 1.6或1.7。

Logstash 6.4.2

同样从官网下载6.4.2版本的Logstash安装包,解压之后进入/config目录,创建一个配置文件tcp.conf,内容如下:

input 
    stdin 
    

filter 

output 
    stdout 
        codec => rubydebug
    

接着进入/bin目录,运行命令如下:

logstash -f ../config/test.conf

当看到Successfully started Logstash API endpoint的字眼时表示启动成功,此时输入任意字符,比如输入hello,可以得到相应的反馈,如下:


       "message" => "hello\r",
    "@timestamp" => 2019-05-09T14:48:04.033Z,
          "host" => "DESKTOP-S7HJJKD",
      "@version" => "1"

这里解释下,Logstash的配置非常简单,就是一套流程:input -> filter -> output

input用来收集信息,这里配置的是stdin插件,即标准输入,也就是刚刚在控制台里输入的字符串。
filter表示过滤信息,这里没有进行任何过滤。
output表示输出信息,这里配置的是stdout插件,即标准输出,也就是将信息输出到控制台上。这里的codec指明使用rubydebug作为编解码器。

接着是运行的命令,使用了-f参数来指定使用某个配置文件。如果想要热加载的效果,可以加上-r参数,这样就可以在运行Logstash的时候去修改配置文件并自动重加载生效。这个-r参数等同于--config.reload.automatic。如下:

logstash -f ../config/test.conf -r
logstash -f ../config/test.conf --config.reload.automatic

注意,如果在输入源里使用了stdin或者syslog等输入插件,是不支持热加载的,会一直报错。

Kibana 6.4.2

从官网上下载Kibana6.4.2的压缩包,解压后即可使用。接着进入/bin目录,运行kibana.bat。运行成功后,在浏览器输入localhost:5601,即可访问Kibana的页面,之后就可以通过这个Kibana提供的web界面来对Elasticsearch里的文档进行各种操作。

Logstash + Log4j2的快速搭建用例其一

配置tcp插件并启动Logstash

修改之前创建的Logstash的配置文件test.config,内容如下:

input 
    tcp 
        mode => "server"
        host => "127.0.0.1"
        port => 4567
    

filter 

output 
    stdout 
        codec => rubydebug
    

然后运行命令logstash -f ../config/test.conf -r来启动Logstash。由于我们这里通过-r来启用了热加载功能,所以可以在运行中直接修改配置并生效,比如修改input里的port。热加载成功后会看到如下字眼:

Reloading pipeline "pipeline.id"=>:main

使用了Socket Appender的Log4j2项目demo

接着准备一个使用了Log4j2的项目demo,如下是一个测试类Test.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test 
    public static final Logger LOGGER = LogManager.getLogger("elk.test");

    public static void main(final String[] args) 
        LOGGER.info("Hello world!");
    

这里使用的是2.11.1版本的Log4j2,Maven依赖如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

接着是配置Log4j2的配置文件log4j2.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude" monitorInterval="30">

    <Properties>
        <Property name="LOG_PATTERN">"logger": "%logger", "level": "%level", "msg": "%message"%n</Property>
    </Properties>

    <Appenders>
        <Console name="stdout" target="SYSTEM_OUT">
            <PatternLayout pattern="$LOG_PATTERN" />
        </Console>

        <Socket name="logstash-tcp" host="127.0.0.1" port="4567" protocol="TCP">
            <PatternLayout pattern="$LOG_PATTERN"/>
        </Socket>
    </Appenders>

    <Loggers>
        <Logger name="elk.test" level="info" additivity="false">
            <AppenderRef ref="stdout" />
            <AppenderRef ref="logstash-tcp" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="stdout" />
        </Root>
    </Loggers>

</configuration>

从配置文件中可以看到,这里使用的是Socket Appender来将日志打印的信息发送到Logstash。

注意了,Socket的Appender必须要配置到下面的Logger才能将日志输出到Logstash里!

另外这里的host是部署了Logstash服务端的地址,并且端口号要和你在Logstash里配置的一致才行。

运行该项目demo,可以看到Logstash的控制台收集到了数据,如下:


          "host" => "127.0.0.1",
       "message" => "\"logger\": \"elk.test\", \"level\": \"INFO\", \"msg\": \"Hello world!\"\r",
    "@timestamp" => 2019-05-09T16:20:35.940Z,
      "@version" => "1",
          "port" => 49781

注意

这里由于使用的是Socket方式来连接Logstash的服务端,如果在连接期间,Logstash的服务停止了或者断掉了,就算接下来重启了Logstash,项目工程也无法自动重新连接上Logstash,除非重启项目工程。

在生产环境中,Logstash自然是有可能半路出问题重启的,所以不能使用这种Socket方式来传输日志。

可以使用gelf的方式来传输日志到Logstash,用例如下所示。

Logstash + Log4j2的快速搭建用例其二

配置gelf插件并启动Logstash

修改之前创建的Logstash的配置文件test.config,内容如下:

input 
    gelf 
        host => "127.0.0.1"
        port => 4567
        use_tcp => true
    

filter 

output 
    stdout 
        codec => rubydebug
    

运行命令logstash -f ../config/test.conf -r启动Logstash。

在Log4j2项目中使用Gelf Appender

将之前的项目工程里的log4j2.xml的Socket Appender改为使用Gelf Appender,如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude" monitorInterval="30">

    <Properties>
        <Property name="LOG_PATTERN">"logger": "%logger", "level": "%level", "msg": "%message"%n</Property>
    </Properties>

    <Appenders>
        <Console name="stdout" target="SYSTEM_OUT">
            <PatternLayout pattern="$LOG_PATTERN" />
        </Console>

        <Gelf name="logstash-gelf" host="tcp:localhost" port="4567" version="1.1" ignoreExceptions="true"
             extractStackTrace="true" filterStackTrace="false">
            <Field name="timestamp" pattern="%dyyyy-MM-dd'T'HH:mm:ss.SSSZ" />
            <Field name="level" pattern="%level" />
            <Field name="simpleClassName" pattern="%C1" />
            <Field name="className" pattern="%C" />
            <Field name="server" pattern="%host" />
        </Gelf>
    </Appenders>

    <Loggers>
        <Logger name="elk.test" level="info" additivity="false">
            <AppenderRef ref="stdout" />
            <AppenderRef ref="logstash-gelf" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="stdout" />
        </Root>
    </Loggers>

</configuration>

另外,这个Gelf Appender需要导入另一个依赖,如下:

<dependency>
    <groupId>biz.paluch.logging</groupId>
    <artifactId>logstash-gelf</artifactId>
    <version>1.11.1</version>
</dependency>

接着运行项目工程,可以看到Logstash的控制台已经把收集到的日志打印出来了:


            "message" => "Hello world!",
         "@timestamp" => 2019-05-10T14:09:43.267Z,
          "className" => "lewky.cn.Test",
        "source_host" => "127.0.0.1",
          "timestamp" => "2019-05-10T22:09:43.211+0800",
    "simpleClassName" => "Test",
           "facility" => "logstash-gelf",
              "level" => "INFO",
               "host" => "DESKTOP-S7HJJKD",
           "@version" => "1",
             "server" => "DESKTOP-S7HJJKD"

ELK + Log4j2快速搭建用例

接下来就可以把Logstash收集到的日志输出到Elasticsearch,并通过Kibana显示到界面上。

Logstash配置Elasticsearch插件

修改配置文件如下:

input 
    gelf 
        host => "127.0.0.1"
        port => 4567
        use_tcp => true
    

filter 

output 
    stdout 
        codec => rubydebug
    
    elasticsearch 
        hosts => ["127.0.0.1:9200"]
        document_id => "%docId"
        index => "%indexName"
    

output里添加了elasticsearch插件:

  1. hosts里配置Elasticsearch server的地址
  2. document_id是index到ES时使用的索引id
  3. index是index到ES是使用的索引名字

修改log4j2.xml和项目代码

在项目的log4j2.xml里的Gelf Appender加上两个个新的Field:indexNamedocId,如下:

<Gelf name="logstash-gelf" host="tcp:localhost" port="4567" version="1.1" ignoreExceptions="true"
     extractStackTrace="true" filterStackTrace="false">
    <Field name="timestamp" pattern="%dyyyy-MM-dd'T'HH:mm:ss.SSSZ" />
    <Field name="level" pattern="%level" />
    <Field name="simpleClassName" pattern="%C1" />
    <Field name="className" pattern="%C" />
    <Field name="server" pattern="%host" />

    <Field name="indexName" mdc="indexName" />
    <Field name="docId" mdc="docId" />
</Gelf>

这里添加的两个新的Field对应于上边Logstash配置文件里的两个变量,然后这里用到了mdc,这个是Log4j2里的ThreadContext的东西,有兴趣可以去了解下Log4j2里的MDC和NDC。

接着修改测试类的代码,如下:

public class Test 
    public static final Logger LOGGER = LogManager.getLogger("elk.test");

    public static void main(final String[] args) 
        ThreadContext.put("docId", "1");
        ThreadContext.put("indexName", "test");

        LOGGER.info("Hello world!");
    

接着依次启动ELK三个软件,然后运行项目,可以发现Logstash控制台里收集到了日志信息:


    "simpleClassName" => "Test",
             "server" => "DESKTOP-S7HJJKD",
            "message" => "Hello world!",
           "@version" => "1",
        "source_host" => "127.0.0.1",
          "indexName" => "test",
              "level" => "INFO",
         "@timestamp" => 2019-05-11T16:40:14.996Z,
           "facility" => "logstash-gelf",
          "className" => "lewky.cn.Test",
          "timestamp" => "2019-05-12T00:40:14.877+0800",
              "docId" => 1,
               "host" => "DESKTOP-S7HJJKD"

而在我们的IDE控制台(我用的是Eclipse)里也可以看到输出了信息:

"logger": "elk.test", "level": "INFO", "msg": "Hello world!"

配置Kibana查看Elasticsearch的index数据

接下来就是最后一步了,通过Kibana来查看我们刚刚index到Elasticsearch里的数据。

启动了Kibana后,在浏览器访问localhost:5601,进入界面后,操作如下:

  1. Management -> Index Patterns
  2. 输入index的名字,我们这里填的是test;然后点击Next step
  3. Time Filter field name下方的下拉框里选择timestamp作为我们的一个排序字段,默认是desc,即递减排序
  4. 最后点击Create index pattern

现在已经配置好了Index pattern,我们就可以直接在左侧菜单栏里的Discover去查看对应的index里的数据了。如果不出意外,现在在Discover里已经看到刚刚被我们index进去的日志信息了。

默认只会显示Time_source两个字段的数据,Time就是排序字段,它的值和之前我们选择的那个timestamp一样。_source里则是所有字段的数据总和。

可以根据需要,在显示字段的左侧把任意的字段add到右侧以显示出来。当你添加了新的字段之后,_source字段会自动消失。

这就是最简单的一个ELK快速搭建例子,有兴趣的可以接着看后续的文章以了解更多和ELK相关的问题或知识。

参考链接

elk系列三:elasticsearch的简单使用和配置文件简介(代码片段)

1、定义模板创建索引:首先定义好一个模板的例子"order":14,"template":"ids-1","state":"open","settings":"number_of_shards":1,"mappings":"warnning":"properties":"name":"type":"keyword","createtime":"type":"date","form 查看详情

2021年大数据elk:elasticsearch简单介绍

...;帮助大家回顾前面的知识重点。目录系列历史文章 一、Elasticsearch简介1、介绍2、创始人二、Elasticsearch可以做什么1、信息检索2、企业内部系统搜索3、数据分析引擎三、Elasticsearch特点1、海量数据处理2、开箱即用 3、作为传统... 查看详情

2021年大数据elk:elasticsearch中的核心概念

...,帮助大家回顾前面的知识重点。目录系列历史文章Elasticsearch中的核心概念一、索引index二、映射mapping三、字段Field四、类型Type五、文档document六、集群cluster七、节点node八、分片和副本shards&replicas​​​​​1、分片2、... 查看详情

2021年大数据elk:安装elasticsearch(代码片段)

...0c;帮助大家回顾前面的知识重点。目录系列历史文章安装Elasticsearch一、创建普通用户二、为普通用户itcast添加sudo权限三、上传压缩包并解压四、修改配置文件1、修改elasticsearch.yml2、修改jvm.option五、将安装包分发到其他服务器... 查看详情

elk系列~log4-nxlog-fluentd-elasticsearch写json数据需要注意的几点

...失败问题)》,今天我们主要总结一下,在与log4和fluentd及elasticsearch配合工作时需要注意的几个点,这几个点也是我们经常遇到的坑,希望可以帮到大家!我们从日志产生端log4开始说。log4需要注意的,编码与时间戳格式nxlog需要... 查看详情

2021年大数据elk:安装elasticsearch(代码片段)

...0c;帮助大家回顾前面的知识重点。目录系列历史文章安装Elasticsearch一、创建普通用户二、为普通用户添加sudo权限三、上传压缩包并解压四、修改配置文件1、修改elasticsearch.yml2、修改jvm.option五、将安装包分发到其他服务器上面... 查看详情

2021年大数据elk:elasticsearch安装ik分词器插件(代码片段)

...面的知识重点。目录系列历史文章安装IK分词器一、下载ElasticsearchIK分词器二、切换到lanson用户,并在es的安装目录下/plugins创建ik三、将下载的ik分词器上传并解压到该目录四、将plugins下的ik目录分发到每一台服务器五、重启... 查看详情

2021年大数据elk:elasticsearch中的核心概念

...,帮助大家回顾前面的知识重点。目录系列历史文章Elasticsearch中的核心概念一、索引index二、映射mapping三、字段Field四、类型Type五、文档document六、集群cluster七、节点node八、分片和副本shards&replicas​ 查看详情

20170805_elasticsearch_简介和安装

官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.htmlElk是一个可高度扩展的搜索和分析引擎,能实时的存储,搜索和分析大量数据.ELK可以做什么:  1) 和在线网络商店关联,存储销售产品信息,为客户自动提... 查看详情

docker系列认识elk,docker安装elk和ik分词器

1.ELK简介ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana,它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方... 查看详情

elkdocker6.elasticsearch集群启动多节点+解决es节点集群状态为yellow

...动的是单个的ES节点。 系列文章:【ELK】【docker】【elasticsearch】1.使用Docker和Elasticsearch+kibana5.6.9搭建全文本搜索引擎应用集群,安装ik分词器【ELK】【docker】【elasticsearch】2.使用elasticSearch+kibana+logstash+ik分词器+pinyin分词器+繁... 查看详情

2021年大数据elk:安装elasticsearch-head插件

...0c;帮助大家回顾前面的知识重点。目录系列历史文章安装Elasticsearch-head插件一、安装nodejs1、下载安装包2、创建软连接3、修改环境变量二、在线安装(网速慢,不推荐)1、在线安装必须依赖包2、从git上面克隆编译包 查看详情

elk系列-elasticsearch+logstash+kibana+log4j2快速入门与搭建用例(代码片段)

前言最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录。首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开发者日后的维... 查看详情

elk-elasticsearch-6.3.2部署(代码片段)

 参考博客:linux下ElasticSearch.6.2.2集群安装与head、Kibana、X-Pack..插件的配置安装参考博客:ELK5.5.1插件安装实践纪要(head/bigdesk/kopf/cerebo/中文分词插件)参考博客:ELK构建MySQL慢日志收集平台详解参考博客:针对Logstash吞吐量... 查看详情

2021年大数据elk:elasticsearch架构原理(代码片段)

...历史文章目录,帮助大家回顾前面的知识重点。目录Elasticsearch架构原理一、Elasticsearch的节点类型1、Master节点2、DataNode节点二、分片和副本机制1、分片(Shard)2、副本3、指定分片、副本数量三、Elasticsea 查看详情

2021年大数据elk:elasticsearch安装ik分词器插件(代码片段)

...面的知识重点。目录系列历史文章安装IK分词器一、下载ElasticsearchIK分词器二、切换到lanson用户,并在es的安装目录下/plugins创建ik三、将下载的ik分词器上传并解压到该目录四、将plugins下的ik目录分发到每一台 查看详情

hidselasticsecurity系列1-elasticsecurity介绍

零、介绍1.elk背景介绍Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建。它的代码位于GitHub-elastic/elasticsearch:FreeandOpen,Distributed,RESTfulSearchEngine。目前,Elasticsearch是一个免费... 查看详情

2021年大数据elk:elasticsearch架构原理(代码片段)

...历史文章目录,帮助大家回顾前面的知识重点。目录Elasticsearch架构原理一、Elasticsearch的节点类型1、Master节点2、DataNode节点二、分片和副本机制1、分片(Shard)2、副本3、指定分片、副本数量三、Elasticsearch重要工作流... 查看详情