在Mac OS X上通过ELK堆栈进行构建并使用JAVA将日志输出到Elasticsearch(log4j2)

各位,好久不见了。

构建ELK堆栈

事先准备

为了安装ELK,您需要安装Homebrew和JAVA JDK。如果您尚未安装,请先安装。

家庭酿制

在我的工作路径下

$ mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

Java软件开发工具包

请参考Oracle的Java SE下载页面。
为了保险起见,我选择了JDK 8版本。

梅花鹿

ELK是什么?

ELK Stack是指Elasticsearch公司的三个产品的综合,它们是Elasticsearch(分析)、Logstash(收集)和Kibana(可视化)。
(在实际运行时,使用LEK的流程执行。)

弹性搜索

Elasticsearch 是 Elastic 公司开发的开源全文搜索引擎,可以快速从大量的文档中提取包含目标词汇的文档。

Elasticsearch 不是关系数据库,所以不能使用 SQL 语句。而是使用 RESTful 接口进行操作。

这次我们将使用Elasticsearch 6.2.4。

安装

$ brew install elasticsearch

设定主机

首先,找到elasticsearch.yml文件。

$ brew info elasticssearch

我认为会出现此类信息。

...(Blah Blah Blah)...
Data:    /usr/local/var/lib/elasticsearch/elasticsearch_JP23417/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_JP23417.log
Plugins: /usr/local/var/elasticsearch/plugins/
Config:  /usr/local/etc/elasticsearch/
...(Blah Blah Blah)...

elasticsearch.yml文件位于config路径下。请打开该文件,并将network.host的值更改为实际使用的IP地址。由于我们在本地环境中构建,因此已将该设置取消注释。

network.host: localhost

确认运动

使用 `brew services elasticsearch start` 命令来启动 Elasticsearch。
Elasticsearch 默认在端口号 9200 上运行,访问 http://localhost:9200,您将看到如下信息显示。

{
  "name" : "ry1EXQC",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ZMYVLV-eR-G5hBrQ6QmSGA",
  "version" : {
    "number" : "6.2.4",
    "build_hash" : "ccec39f",
    "build_date" : "2018-04-12T20:37:28.497551Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

日志鱼

Logstash是一个开源的服务器端数据处理管道。它可以同时从大量的来源中导入数据并进行转换,然后发送到您喜欢的存储库(Stash)。当然,我们推荐的是Elasticsearch作为存储库。

本次将使用Logstash 6.2.4版本。

安装和启动

$ brew install logstash
$ brew services start logstash

实际上,Logstash会根据配置文件进行操作。您需要为每个场景配置不同的配置文件。这样,Kibana应该能够正常运行,详细信息稍后会进行解释。

Kibana坐落

Kibana是一个能够方便地将Elasticsearch数据可视化的工具。

本次使用的是Kibana 6.2.4版本。

安装

$ brew install kibana

设置Port和Elasticsearch。

首先,找到 kibana.yml 文件。

$ brew info kibana

我认为会出现这样的信息。

...(Blah Blah Blah)...
Config: /usr/local/etc/kibana/
...(Blah Blah Blah)...

kibana.yml在配置文件夹的指定路径下。
请打开它并将server.port和elasticsearch.url更改为实际使用的值。这里我们按照默认设置进行了这些配置。

...(Blah Blah Blah)...
server.port: 5601 

...(Blah Blah Blah)...

elasticsearch.url: "http://localhost:9200”
...(Blah Blah Blah)...

确认

スクリーンショット 2018-09-12 16.56.32.png

使用JAVA进行日志输出(log4j2)。

我們將使用TCP來創建一個將日誌發送到Elasticsearch的工具。

创建一个Maven项目

スクリーンショット 2018-09-12 17.07.29.png

Maven库的布置

所以说就是指pom.xml文件的内容对吧。
请在dependencies标签中添加以下内容。

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
</dependencies>

Log4j2的配置

换句话说,这是指log4j2.xml文件的内容。Log4j2将根据这个文件确定日志的发送目的地。
本次发送当然是通过Logstash发送到Elasticsearch,但考虑到方便调试,我们也决定同时在Console上输出日志。

<configuration status="OFF">
    <appenders>
        <Socket name="Logstash" host="localhost" port="9601" protocol="TCP">
            <PatternLayout pattern="%d|%t|%p|%c|%L|%m%n" />
        </Socket>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d|%t|%p|%c|%L|%m%n" />
        </Console>
    </appenders>
    <loggers>
        <root level="all">
            <AppenderRef ref="Logstash"/>
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

如果您想个性化,请参考此页面。

主要的类

这是输出日志的行为。

package log4j2.local;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;


public class Main {
    private static Logger logger = LogManager.getLogger("test");

    public static void main(String[] args) {
        logger.error("エラーメッセージです");
    }
}

当执行这个操作时,控制台会显示出这样的日志。(由于尚未连接Logstash,所以当然也不会保存到Elasticsearch中。)

2018-09-12 12:55:13,962|main|ERROR|test|13|エラーメッセージです

将Logstash部署

Logstash配置方案

在喜欢的路径下没问题,我们来创建一个logstash-tcp.conf文件。(仅仅是因为它是TCP通信,所以取了这个名字。)
Logstash默认情况下可以使用9600至9700之间的所有端口,所以这次我们将使用9601号端口。(请务必与log4j2.xml中的标签使用相同的端口。)

input {
    tcp {
        host => "localhost"
        port => "9601"
        mode => "server"
        type => "eslocallogger"
    }
}

filter {
    mutate{
        split => ["message","|"]
        add_field =>   {
            "Datetime" => "%{[message][0]}"
        }
        add_field =>   {
            "Classname" => "%{[message][1]}"
        }
        add_field =>   {
            "Level" => "%{[message][2]}"
        }
        add_field =>   {
            "Logger" => "%{[message][3]}"
        }
        add_field =>   {
            "Message" => "%{[message][5]}"
        }
    }
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => "localhost:9200"
    }
}

在这里,我们使用过滤器来分隔模式,但是即使不使用过滤器,默认的列也会自动解析。
(在这里,我们用 | 来分隔进入 Logstash 的错误消息。)

将Logstash与配置文件连接并重新启动。

$ brew services stop logstash
$ logstash -f ./logstash-tcp.conf --experimental-java-execution

如果有–experimental-java-execution选项,它将在JAVA引擎上运行。请参阅《了解新的Logstash Java执行引擎》以获取更多详细信息。我记得这样做会显著提高吞吐量。

我们来试一试

控制台

2018-09-12 18:05:39,737|main|ERROR|test|13|エラーメッセージです

Logstash控制台

[2018-09-12T18:05:40,464][DEBUG][logstash.pipeline        ] Pushing flush onto pipeline {:pipeline_id=>"main", :thread=>"#<Thread:0x5caa3237 sleep>"}
{
         "Level" => "ERROR",
    "@timestamp" => 2018-09-12T09:05:39.847Z,
        "Logger" => "test",
          "port" => 60614,
       "message" => [
        [0] "2018-09-12 18:05:39,737",
        [1] "main",
        [2] "ERROR",
        [3] "test",
        [4] "13",
        [5] "エラーメッセージです"
    ],
          "type" => "eslocallogger",
       "Message" => "エラーメッセージです",
      "Datetime" => "2018-09-12 18:05:39,737",
          "host" => "localhost",
      "@version" => "1",
     "Classname" => "main"
}

基本说起来,Kibana。

スクリーンショット 2018-09-12 18.11.25.png

请参考来源。

在Mac OS X上安装ELK Stack
ElasticSearch+Logstash+Kibana+log4j2 的官方6.1.1版本安装配置简介
使用LogStash的Filter功能
使用Elastic Stack

广告
将在 10 秒后关闭
bannerAds