Help us understand the problem. What is going on with this article?

Mac OS X上にてELKスタック構築及びJAVAによるログをElasticsearchに出力(log4j2)

More than 1 year has passed since last update.

みなさん、お久しぶりです。

ELKスタック構築

前準備

ELKをインストールする為に、HomebrewとJAVA JDKが必要となります。インストールされていない方は先に入れておいてください。

Homebrew

自分の作業するパスの下に

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

Java SDK

OracleのJava SE Downloadsに参考してください。
念のためJDK 8にしました。

ELK

ELKとは

ELKスタックとはElasticsearch社のElasticsearch(解析) + Logstash(収集) + Kibana(可視化)の3つの製品の総称です。
(実際に動く際に、LEKのフローで動いてますが)

Elasticsearch

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

Logstashは、オープンソースのサーバーサイドデータ処理パイプラインです。膨大な数のソースから同時にデータを取り込み、変換して、お好みの格納庫(スタッシュ)に送信します。お勧めのスタッシュは、もちろんElasticsearchです。

今回はLogstash 6.2.4を使用します。

インストールと起動

$ brew install logstash
$ brew services start logstash

Logstashは実はコンフィグに連動して動いてます。各シーンに違うコンフィグを配置する必要があります。とりあえずこれでKibanaを動けるはずなので、詳しくはあとで説明します。

Kibana

KibanaはElasticsearchのデータを簡単に可視化するツールです。

今回はKibana 6.2.4を使用します。

インストール

$ brew install kibana

ポートとElasticsearchを設定する

まずは、kibana.ymlを見つかります。

$ brew info kibana

でこのような情報が出てくると思います。

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

kibana.ymlは、Configに書いてあるパスの下にあります。
それを開いて、server.portelasticsearch.urlを実際に使うものに変更してください。今回はデフォルトの設定のままでこう設定しました。

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

...(Blah Blah Blah)...

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

確認

これできたら、http://localhost:5601/status から確認できるはずです。
このような画面出てきます。
スクリーンショット 2018-09-12 16.56.32.png

JAVAによるログ出力(log4j2)

今回はTCPによって、ログをElasticsearchに送信するツールを作ります。

Mavenプロジェクトを作成

どっかのIDEでMavenプロジェクトを自動生成するのがあると思いますが、ぜひそれを使ってください。
だいたいこういう形で生成すれば問題ないです。ご参考まで。
スクリーンショット 2018-09-12 17.07.29.png
今回のパッケージ名はlog4j2.localです(実はなんでもいいです)。

Mavenのライブラリ配置

つまりpom.xmlの中身ってことですね。
dependenciesタグに以下のように追加してください。

pom.xml
<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に送信しますが、Debugしやすさも考慮すると一応Consoleにも出力する形にしておきました。

log4j2.xml
<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>

個性化したい方はこのページに参考してください。

Mainクラス

ログを出力する挙動です。

Main.java
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("エラーメッセージです");
    }
}

これを実行すると、Consoleにはこのようなログが出てきます。
(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<Socket>タグと同じポートにしてください。)

logstash-tcp.conf
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"
    }
}

ここではSchemaを分けるためにFilterを使いましたが、使わなくてもデフォルトのカラムは自動的にパースされます。
(ここでは、Logstashに入ってきたエラーメッセージを|で区きりします。)

Logstashをコンフィグに連結して再起動

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

--experimental-java-executionのフラグがあると、JAVAのエンジンで走ります。
詳しくはMeet the New Logstash Java Execution Engineからご覧ください。確かそうした方がスループットが大分上がります。

実行してみよう

Console

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

Logstash Console

[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

KibanaのManagement画面に行ってリロードすると、このような画面が出てくるはずです。
スクリーンショット 2018-09-12 18.08.52.png
Next stepに行って、filter@timestampにしてCreate index patternをクリックすると、インデックスの可視化を始めます。
スクリーンショット 2018-09-12 18.11.16.png
Discover画面に入ったら、時間軸のデータを見れます。
スクリーンショット 2018-09-12 18.11.25.png
詳しくはKibanaの使い方に参考してください。

参考元

Installing the ELK Stack on Mac OS X
ElasticSearch+Logstash+Kibana+log4j2 官方6.1.1版安装配置简介
LogStash的Filter的使用
Elastic Stack

tenten1010
早稲田基幹理工学部表現工学科4年 大学から日本来ました留学生です 日本語はビミョいです😅
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした