LogstashでApacheのログをElasticsearchに投入する方法

Logstashを使って、Elasticsearchにログを登録する方法を下記の通りまとめた。
再起動時のプロセスの自動起動についても手順の中に織り込み済み。

#インストール


ここを参考
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

#Yumリポジトリの登録



##GPG-Keyの登録
``sudo rpm --httpproxy 129.168.0.1 --httpport 7777 --import https://packages.elastic.co/GPG-KEY-elasticsearch``

##viコマンドでYumリポジトリURLを追加
``sudo vi /etc/yum.repos.d/logstash.repo``

```properties:/etc/yum.repos.d/logstash.repo
[logstash-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

##YumをつかってLogstashをインストール
``sudo yum install logstash``

###各ファイルのインストール先
Yumを使ってインストールした場合、それぞれ下記の場所が出力先に設定される

| ファイル種類 | 保管パス| ファイル名 |
|:-:|:-:|:-:|
|実行ファイル|/opt/logstash/bin/|logstash |
|Logstash設定ファイル|/etc/init.d/logstash||
|監視設定ファイル場所|/etc/logstash/conf.d|-|
|Logstashログファイル| /var/log/logstash/lo‌​gstash.log |   |

##設定ファイルの作成
次に、logstashの設定ファイルを作成する。
このファイルには、読み込み先のソース（ファイルの場合はファイルパス）、フィルタ、出力先の情報等を記述する。作成した設定ファイルは下記のファイルパスに.confの拡張子付きで保管する。名前はなんでも良い。


| 1 | 2 |
|:-:|:-:|
| 保管先パス | /etc/logstash/conf.d |

コマンド例
``vi /etc/logstash/conf.d/01-httpdlog.conf``

設定ファイルの中身の例は下記の通り。
下記の例では、Apacheによって出力されたログを読み込み、それをElasticsearchに保管している。

```:/etc/logstash/conf.d/01-httpdlog.conf
input {
    file {
        path => "/etc/httpd/logs/access_log"
        start_position => beginning
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    elasticsearch {
       hosts => ["192.168.1.38:9200"]
       index => "test1-%{+YYYY.MM.dd}"
    }
   stdout {}
}
```

コンフィグテスト

```
#4.x
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/01-httpdlog.conf --configtest
#5.x
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/01-httpdlog.conf --configtest
```

コレでConfig設定が正しいかどうかを確認できる
sudo service logstash configtest


```bash:logstash.conf
input {
  file {
     path => "/var/log/httpd/access_log2"
     start_position => "beginning"
  }
}

filter {
     grok {
     #Apacheのログに併せて条件を指定
    match => {
"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{URIPATH:requestpath:string}%{URIPARAM:reqparam}(?: HTTP/%{NUMBER:httpversion})?|%{CISCO_REASON:verb}%{URIPATHPARAM:requestpath:string} HTTP/%{NUMBER:httpversion}?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes:int}|-) (?:%{NUMBER:response_time:int}|-) %{QS:referrer} %{QS:agent}"

}    }
     date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
     }
     #ログに残したくないタイプのパスを指定し、除外する(指定は正規表現)
     if [requestpath] =~ ".ttf$" or [requestpath] =~ ".woff$" {
       drop { }
     }
}

output {
     elasticsearch {
         hosts => ["192.168.1.38:9200"]
         #作成日の年月日をつけてインデックスを作成する
         index => "stacktrace-%{+YYYY.MM.dd}"
      }
    #標準出力に出力
    stdout { codec => rubydebug }
}


```

（参考）Apacheのログ出力設定
```:/etc/httpd/conf/httpd.conf
 ...
 LogFormat "%h %l %u %t \"%r\" %s %b %D \"%{Referer}i\" \"%{User-agent}i\"" new_format
 ...
```



logstashはデフォルトではlogstash:logstashで実行される。
/etc/init.d/logstashを参照

```properties:/etc/init.d/logstash
# Description:        Starts Logstash as a daemon.
### END INIT INFO
...
LS_USER=logstash
LS_GROUP=logstash
...
```

5.xの場合は、下記のパスとなる。
``vi /etc/logstash/startup.options 
``
上記の設定ファイルを変更して、プロセスのオーナを変更するか、読むファイルの参照権限を変更する必要がある
``chmod 775 /var/log/httpd/access_log2``

このコマンドで、Logstashのログファイルを確認できる。エラーが起きている場合はここにメッセージが表示されるはず

```
tail -f /var/log/logstash/logstash.log
tail -f /var/log/logstash/logstash-plain.log #5.0以降はこちらに変更となった
```

##起動方法
```:起動
systemctl start logstash.service 
```
```:起動確認
systemctl status logstash.service 
```
##stacktraceを読み取る

```
  file {
    path => "/home/nagase/server.log.2016-06-30"
    start_position => "beginning"
    codec => multiline {
      pattern => "^%{TIMESTAMP_ISO8601}"
      negate => true
      what => "previous"
    }
  }
}
filter {
  mutate {
    gsub => [ "message", "r", "" ]
  }
  grok {
    match => [ "message", "(?m)%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:severity} %{GREEDYDATA:message}" ]
    overwrite => [ "message" ]
  }
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss,SSS" ]
  }
}

output {
    elasticsearch {
       hosts => ["172.31.27.51:9200"]
       index => "stacktrace-%{+YYYY.MM.dd}"

    }
    stdout { codec => rubydebug }
```