15分で作る、Logstash+Elasticsearchによるログ収集・解析環境

複数台のサーバーを運用している場合に、それらのログを集中管理したいというケースがある。この場合、ログを収集するためのサーバーを用意し、そこに各サーバーからログを送信して集中管理することになる。こういった環境を構築するためのツールとして近年注目されているのが、ログ管理ツール「Logstash」と、分散型データベース「Elasticsearch」の組み合わせだ。今回はこれらツールの概要と、これらを利用したログ収集環境の構築例を紹介する。

「Elasticsearch」と「Logstash」、「Kibana」によるログ収集管理システム構築


使

11Logstash1Logstash1
図1 LogstashのWebサイト図1 LogstashのWebサイト
1 LogstashWeb

Logstash


LogstashLogstashinputfiltercodecoutput21
図2 Logstashの構造
図2 Logstashの構造
表1 Logstashのプラグイン種別
種別 説明 主なプラグイン名
input ログを記録するイベントを監視する eventlog、file、pipe、stdin、tcpなど
codec inputから受け取ったイベントを指定した形式に整形する rubydebug、json、fluent、plainなど
filter イベントに対しフィルタ処理を行う checksum、json、xmlなど
output ログの出力を行う csv、exec、email、file、elasticsearchなど

inputstdinoutputfile使Logstash1Elasticsearch

Elasticsearch


Elasticsearch2ElasticAmazonAmazon Elastic Compute CloudEC2
図2 ElasticsearchのWebサイト図2 ElasticsearchのWebサイト
2 ElasticsearchWeb

ElasticsearchJavaLuceneGitHubThe GuardianElasticSearch

ElasticsearchLogstash使Elasticsearch使ElasticsearchHTTPREST

ElasticsearchKibana


Elasticsearch1ElasticsearchKibana3
図3 Kibanaのダッシュボード画面図3 Kibanaのダッシュボード画面
3 Kibana

KibanaWebElasticsearch

Kibana使Kibana使ElasticsearchLogstash使

LogstashElasticsearchKibanaElasticsearchElasticsearchLogstashKibanaElasticsearch ELK Stack

ElasticsearchLogstashKibana/


ElasticsearchLogstashJavaRubyLinuxMac OS XUNIXWindowsLinuxDEBRPM

Red Hat Enterprise Linux 7CentOS 7CentOS 7.0ElasticsearchLogstashKibanaApache HTTP Server

ElasticsearchLogstashJava Runtime EnvironmentJRECentOS 7java-1.7.0-openjdkyumElasticsearchLogstash
# yum install java-1.7.0-openjdk

ElasticsearchLogstashKibana

Elasticsearchyum


ElasticsearchLogstashElasticsearchhttp://www.elasticsearch.org/download/yumapt-getElasticsearchrepositoriesyum

CentOSElasticsearch/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.4]
name=Elasticsearch repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch

[logstash-1.4]
name=logstash repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

Elasticsearch


Elasticsearchyumelasticsearch
# yum install elasticsearch

ElasticsearchElasticsearchelasticsearchelasticsearchsystemctl daemon-reloadsystemctl enablesystemctl start
# systemctl daemon-reload
# systemctl enable elasticsearch.service
ln -s '/usr/lib/systemd/system/elasticsearch.service' '/etc/systemd/system/multi-user.target.wants/elasticsearch.service'
# systemctl start elasticsearch.service

JREJREElasticsearch/var/log/elasticsearch

Elasticsearch


Elasticsearch/etc/elasticsearchelasticsearch.ymlElasticsearch

Kibana使1ElasticsearchIPIPnetwork.bind_host#IP使
#network.bind_host: 192.168.0.1

使transport.tcp.port9300使
#transport.tcp.port: 9300

KibanaElasticseach
# enable cross-origin resource sharing
http.cors.enabled: true

WebKibanaElasticseach

systemctlelasticseach
# systemctl restart elasticsearch

KibanaJavaScript使WebElasticsearchKibanaKibanaWebPCElasticsearch

ElasticsearchHTTPElasticsearch

Logstash


Logstashyum
# yum install logstash

Logstashlogstash-contrib

/opt/logstashlogstash/etc/logstashLogstashlogstash

Kibana


KibanaRPMZIPTARKibanaHTMLCSSWebJavaScriptWeb

CentOSApache HTTP Serverhttpd使http:///kibanaURLKibana
# cd /var/www/html
# wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.2.tar.gz
# tar xvzf kibana-3.1.2.tar.gz 
# mv kibana-3.1.2 kibana
# rm -f kibana-3.1.2.tar.gz

Kibana 3.1.2使URL使

Kibana


Kibanaconfig.jsKibanaKibanaElasticsearchElasticsearchelasticseach
elasticsearch: "http://"+window.location.hostname+":9200",

192.168.1.1Elasticsearch
elasticsearch: "http://192.168.1.1:9200",

JSON,

KibanaJavaScriptWebWebElasticsearchREST APIElasticsearchWeb

KibanaURLhttp:///kibanaKibanaIntroduction4
図4 Kibanaの「Introduction」ページ図4 Kibanaの「Introduction」ページ
4 KibanaIntroduction

herehttp:///kibana/index.html#/dashboard/file/logstash.jsonLogstashLogstash

LogstashElasticsearch


Logstash使Elasticsearch

RPMLogstashLogstash/opt/logstash/bin/logstashElasticsearch

Apache HTTP ServerElasticsearchKibanaApache HTTP ServerElasticsearch


Logstash使inputoutputfiltercodeclogstash
<プラグインの種類> {
  <使用するプラグイン1> {
    <設定パラメータ1> => <設定する値>
    <設定パラメータ2> => <設定する値>
    :
    :
  }
  <使用するプラグイン2> {
    <設定パラメータ1> => <設定する値>
    <設定パラメータ2> => <設定する値>
    :
    :
  }
  :
  :
}

#

inputfilteroutput使

 => Booleantruefalse"RubyPython
[<1つめの値>, <2つめの値>, ...]

Ruby
{
 『<キー1>』=> <値1>
 『<キー2>』=> <値2>
  :
  :
}

ifelseLogstash


Apacheapache_import.conf
input {
  stdin { }
}

filter {
  grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    locale => "en"
  }
  mutate {
    replace => { "type" => "apache_access" }
  }
}

output {
  # stdout { codec => rubydebug }
  elasticsearch { host => '172.17.4.199' }
}

inputstdin使1

Logstashstdinfilter
{
  "message" => "<入力されたテキスト>",
  "@version" => "1",
  "@timestamp" => "<読み込み実行時のタイムスタンプ",
  "host" => "<コマンドを実行したホスト名>"
}

filtergrokdatemutate

grok
grok {
  match => { "message" => "%{COMBINEDAPACHELOG}" }
}

matchmessageApache HTTP ServerCombined"%{COMBINEDAPACHELOG}"

***.***.**.*** - - [10/Nov/2014:14:30:27 +0000] "GET /2007/03/ HTTP/1.1" 200 - "-" "Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)"
{
        "message" => "***.***.**.*** - - [10/Nov/2014:14:30:27 +0000] \"GET /2007/03/ HTTP/1.1\" 200 - \"-\" \"Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)\"",
       "@version" => "1",
     "@timestamp" => "2014-11-19T15:37:46.934Z",
           "host" => "corei7.office.osdn.jp",
       "clientip" => "***.***.**.***",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "10/Nov/2014:14:30:27 +0000",
           "verb" => "GET",
        "request" => "/2007/03/",
    "httpversion" => "1.1",
       "response" => "200",
       "referrer" => "\"-\"",
          "agent" => "\"Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)\""
}

Combined

date@timestamp
date {
  match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  locale => "en"
}

timestamp使grok20141110143027GMT

mutate
mutate {
  replace => { "type" => "apache_access" }
}

typeapache_access

outputelasticsearch
output {
  # stdout { codec => rubydebug }
  elasticsearch { host => '172.17.4.199' }
}

elasticsearchhostElasticsearch172.17.4.199使

# stdout { codec => rubydebug }rubydebug#Elasticsearch

logstashElasticsearch
$ /opt/logstash/bin/logstash -f apache-import.conf < <アクセスログファイル>

Kibana


ElasticsearchKibanaWebKibanaURLhttp:///kibanaherehttp:///kibana/index.html#/dashboard/file/logstash.json5
図5 Kibanaのログ解析ページ図5 Kibanaのログ解析ページ
5 Kibana

Kibana


KibanaLogstashLogstash Search6
図6 対象期間の指定図6 対象期間の指定
6

7
図7 イベントの詳細情報図7 イベントの詳細情報
7

Fields8
図8 「request」を選択した場合の表示例図8 「request」を選択した場合の表示例
8request

View9
図9 グラフの表示設定図9 グラフの表示設定
9


:

response:40440410
図10 ステータスコードが「404」だったログのみを表示させた例図10 ステータスコードが「404」だったログのみを表示させた例
10404

-tags: _grokparsefailuretags_grokparsefailuregroktags

filter1grok
if "_grokparsefailure" in [tags] { drop { } }


10
図10 「Add Panel」アイコン図10 「Add Panel」アイコン
10Add Panel

Add PaneltermsStylepieresponse11
図11 「Add Panel」画面図11 「Add Panel」画面
11Add Panel

1289200
図12 新たに追加された「response」パネル図12 新たに追加された「response」パネル
12response

13
図13 パネルは複数追加できる図13 パネルは複数追加できる
13

Elasticsearch


ElasticsearchElasticsearch

inputElasticsearchfile

logstash使logstash/etc/logstash/conf.d使使/etc/logstash/conf.d/apache-access_log.conf使
input {
  file {
    path => "/var/log/httpd/access_log"
    start_position => beginning
  }
}
filter {
  grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    locale => "en"
  }
  mutate {
    replace => { "type" => "apache_access" }
  }
}

output {
  elasticsearch { host => '172.17.4.199' }
}

使inputfilepathApace HTTP Server/var/log/httpd/access_logstart_positionbegining

logstash
# systemctl enable logstash 
# systemctl start logstash

logstash/var/log/logstash/

Logstash


Apache HTTP ServerLogstash使input



Kibana