LoginSignup
4
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-02

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

/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

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を参照

/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 }
4
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8