はじめに

こんにちは、キャスレーコンサルティングSD(システム・デザイン)部の青木です。

今回はログの収集・可視化ツールとして名前をよく聞くElasticsearch,Logstash,Kibanaを使用して
知りたい情報を可視化してみようと思います。

目次

・構成図と準備物とインストール方法
・明らかにしたい情報とログのサンプル
・Filebeatの設定(ログデータの転送)
・Logstashの設定(ログデータの整形とElasticsearchへの登録)
・Elasticsearchの設定(ログデータのストア)
・Kibanaの設定(ログデータの可視化)
・Elasticsearchに登録されるデータの確認
・Kibanaで可視化されたログデータの確認
・おわりに

構成図と準備物とインストール方法

今回は下図の構成でログの収集・可視化を行います。

図1.構成図
structure

※サーバのOSはCentOS7.2を使用するものとする
※LogstashとElasticsearchの動作にはJava8が必要なためログ収集サーバにはJDK8をインストールしておく必要がある

準備物とインストール方法

以下で、図1の緑色で表示しているツールの準備・設定を行なっていきます。
ツール名 読み方 役割
Filebeat ファイルビート ログをログファイルから読み込みLogstashに転送する
Logstash ログスタッシュ Filebeatから受け取ったログの整形とElasticsearchへの登録をする
Elasticsearch エラスティックサーチ ログデータを保管する
Kibana キバナ Elasticsearchに保管されたログデータを可視化する

Filebeat

○インストールコマンド

          # curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm
          # sudo rpm -vi filebeat-5.2.2-x86_64.rpm
          

※検証時点の最新バージョンにてインストール

○起動コマンド

          # /etc/init.d/filebeat start
          

○参考 インストール方法(公式サイト)
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html

Logstash

○インストールコマンド

          # curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.rpm
          # sudo rpm -ihv logstash-5.2.2.rpm
          

※検証時点の最新バージョンにてインストール

○起動コマンド

Service :

          # initctl start logstash
          

Command line :

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

※ -f 以降は下記で作成をするLogstashの設定ファイルを指定する

○参考 インストール方法(公式サイト)
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

Elasticseaarch

○インストールコマンド

          # wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.rpm
          # sudo rpm --install elasticsearch-5.2.2.rpm
          

※検証時点の最新バージョンにてインストール

○起動コマンド

          # service elasticsearch start
          

○参考 インストール方法(公式サイト)
https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

Kibana

○インストールコマンド

          # wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-x86_64.rpm
          # sudo rpm --install kibana-5.2.2-x86_64.rpm
          

※検証時点の最新バージョンにてインストール
※kibanaには64bit版と32bit版があるが、今回は64bit版をインストール

○起動コマンド

          # service kibana start
          

○参考 インストール方法(公式サイト)
https://www.elastic.co/guide/en/kibana/current/rpm.html#install-rpm

明らかにしたい情報とログのサンプル

今回は図1のアプリケーションについてログから下記の情報を明らかにしていきたいと思います。
・よく使われる機能
・よく使われる機能(年代別)
上記を明らかにするために、アプリケーションは特定の機能が使用された際に下記の形式のログを出力するようにします。

○サンプルログ

    [2017-03-26 11:29:03] local.INFO: userName:testUser sex:man age:20 dataType:usedFunction usedFunctionName:Checkする
    

※ユーザ情報と使用された機能の名前(usedFunctionName)を出力する

Filebeatの設定(ログの転送)

Filebeatの役割

・ログファイルからログを読み込む
・読み込んだログをLogstashに転送する

設定ファイルの保管場所

/etc/filebeat/filebeat.yml

初期状態から書き換える内容

○ログを取得するログファイルの指定

デフォルト状態:

              paths:
                - /var/log/*.log
                #- c:\programdata\elasticsearch\logs\*
            

変更後:

              paths:
                - ログファイルのパスを指定する
                #- c:\programdata\elasticsearch\logs\*
            

○Logstashへの送信設定

Elasticsearchへの送信設定をコメントアウト

デフォルト状態:

                  output.elasticsearch:
                    # Array of hosts to connect to.
                    hosts: ["localhost:9200"]
                

変更後:

                  #output.elasticsearch:
                    # Array of hosts to connect to.
                    # hosts: ["localhost:9200"]
                

Logstashへの送信設定

デフォルト状態:

                #output.logstash:
                  # The Logstash hosts
                  #hosts: ["localhost:5044"]
              

変更後:(「xxx.xxx.xxx.xxx」にはLogstashのサーバのIPアドレスを指定する)

                output.logstash:
                  # The Logstash hosts
                  hosts: ["xxx.xxx.xxx.xxx:5044"]
              

Logstashの設定(ログの整形とElasticsearchへの登録)

Logstashの役割

・Filebeatからログデータを受け取る
・ログデータの整形
・ログデータをElasticsearchに登録する

設定ファイル(デフォルトでは存在していないのでファイルは自分で作成を行う)

/etc/logstash/conf.d/logstash.conf

※上記の設定ファイルはLogstashのデータの転送・整形等に関する設定を行うものであり、
     Logstash本体の設定ファイルは/etc/logstash/logstash.ymlとして別途存在している

設定ファイル(/etc/logstash/conf.d/logstash.conf)への記載内容

          # Filebeatからログデータを受け取る(port番号はfilebeatの設定ファイルの記載内容と合わせる)
          input {
            beats {
              port => "5044"
            }
          }

          # ログデータを整形する
          filter {
            grok {
              match => [
                message, "\[%{YEAR}-%{MONTHNUM2}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}\] %{GREEDYDATA}.%{LOGLEVEL}: userName:%{USERNAME:userName} sex:(?<sex>(man|woman)) age:%{NUMBER:age} dataType:(?<dataType>(usedFunction)) usedFunctionName:%{GREEDYDATA:usedFunctionName}"
              ]
            }
          }

          # 整形したログデータをElasticsearchに登録する
          output {
            elasticsearch {
              hosts => ["localhost:9200"]
              index => "test_app_log-%{+YYYY.MM.dd}"
            }
          }
        

ログデータ整形設定の解説

○整形設定がやること

・ログデータの形式が指定の形式かをチェックする
・指定の形式の場合は、設定に基づいてログデータからフィールドを抽出する

○指定の形式のチェック

形式の指定はmessage, “〜〜〜”の部分に記載をする正規表現で行なっている。

%{YEAR}形式の部分について

正規表現パターン文字列を格納した変数を使用している。
デフォルトで使用できる正規表現パターン文字列は下記の公式サイトから確認することが出来る。
(「Description」のチャプターに記載のあるリンク(patternsに関するもの))
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

%{USERNAME:userName} 形式の部分について

コロンの左側が正規表現パターン文字列を格納した変数、
コロンの右側が正規表現パターンに一致した値を抽出する際のフィールド名となっており、
一致した値は指定のフィールド名で抽出される。

(?<sex>(man|woman))形式の部分について

<>の内側に記載されている文字列がフィールド名、<>以降に記載されているのがパターンをチェックする
正規表現文字列となっている。正規表現文字列に一致した値が<>の内側に記載のあるフィールド名で抽出される。

※値をフィールドとして抽出する際に正規表現パターンを格納した変数を使用せず、
直接正規表現文字列を記載する際はこちらの形式で記載を行う

※なお、今回は行わなかったが、独自に正規表現パターンを格納した変数を作成し使用することも出来る。
詳細は下記の「Custom Patterns」のチャプターを参照
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

Elasticsearchの設定(ログデータのストア)

Elasticsearchの役割

・ログデータを保管する

初期状態から書き換える内容

今回はデフォルト状態のまま動作させるため、設定の書き換えは行わない。

Kibanaの設定(ログデータの可視化)

Kibanaの役割

・Elasticsearchのデータを検索し、データを可視化する

設定ファイル

/etc/kibana/kibana.yml

初期状態から書き換える内容

○kibanaに外部から接続出来るようにする
(デフォルト設定ではlocalhostからしか接続できないため)

デフォルト状態:

            #server.host: "localhost"
          

変更後:(「xxx.xxx.xxx.xxx」にはkibanaのサーバのIPアドレスを指定する)

            #server.host: "localhost"
            server.host: xxx.xxx.xxx.xxx
          

Elasticsearchに登録されるデータの確認

登録されているインデックスの確認

        # curl -X GET http://localhost:9200/_cat/indices?v
        

指定のインデックスに登録されているデータの確認

        # curl -XGET localhost:9200/インデックス名/_search?pretty -d'
          {
            "size": 100,
            "query":{"match_all": {}}
          }'
        

※全件検索(sizeでデータの取得件数を指定する)
※上記クエリはElasticsearchが起動しているサーバで実行する

検索結果として取得される登録データ

※「message」フィールドに記載されている1行のログデータが、filebeatがログファイルから取得したログデータであり
その1行のログデータがElasticsearchには下記のような形式で登録される
※Logstashの設定により下記のフィールドが作成されていることが確認出来る
「userName」「sex」「age」「dataType」「usedFunctionName」

        {
          _index : "test_app_log-2017.03.26",
          _type : "log",
          _id : "AVsKYIK3coo_UhZKyu9O",
          _score : 1.0,
          _source : {
            offset : 5398,
            sex : "man",
            dataType : "usedFunction",
            input_type : "log",
            source : "/usr/share/nginx/html/samplePJ/storage/logs/laravel-2017-03-26.log",
            message : "[2017-03-26 11:29:03] local.INFO: userName:testUser sex:man age:20 dataType:usedFunction usedFunctionName:Checkする",
            type : "log",
            userName : "testUser",
            tags : [
              beats_input_codec_plain_applied
            ],
            @timestamp : "2017-03-26T11:29:08.001Z",
            @version : "1",
            beat : {
              hostname : "localhost.localdomain",
              name : "localhost.localdomain",
              version : "5.2.2"
            },
            host : "localhost.localdomain",
            usedFunctionName : "Checkする",
            age : "20"
          }
        }
        

Kibanaで可視化されたログデータの確認

ユーザがアプリケーションの機能を1回使用すると上記の形式のログデータがElasticsearchに登録される。

登録データは、
どのような機能が使用されたか(usedFunctionName)
どのようなユーザがその機能を使用したか(年齢(age)など)
という情報を持っているため、例えば下記のような条件での検索が可能であり、それぞれの検索結果が
何件存在するかを下記のようにグラフ化(可視化)することができる。

検索条件例
・usedFunctionNameの値が「Checkする」のデータ
・ageの値が「20」のデータ
・usedFunctionNameの値が「Doする」、かつ、ageの値が「30」のデータ

kibana_graph1
kibana_graph2

※Kibanaでは上記の形式のグラフ以外にも様々な形式のグラフが作成可能

おわりに

知りたい情報を含むログを出力し、Logstashで適切にログデータを整形・Elasticsearchに蓄積させておくことで、
Kibanaで自由に様々な情報を可視化できることがわかりました。

多くのログデータを蓄積し可視化することで、これまでには気付くことができなかった情報(価値)に気付くことができ、
そこから新たな価値を生み出すことができるかもしれません。

以上、最後までお読み頂きありがとうございました。