備忘録/にわかエンジニアが好きなように書く

個人的にとりあえず仕組みを知りたいから勉強になる?ってことで、 (利便性無視で)触りたように好きに構築してみる 個人用の備忘録となるので内容の保証はないのでその点はご了承ください。 ※変な内容や間違いを書いているなどありましたらコメントやご指摘いただけると幸いです。

ELK構成に Beats(Filebeat)を導入しログ可視化させる

構成/接続イメージ

f:id:pocket01:20180225031635p:plain

適当なイメージ

FilebeatをWebサーバにインストールを行い、Logstashへログを転送する。

#filebeatからログを直接elasticserchへ送ることも可能だが、今回はfilebeat → Logstash → Elasticsearchの順に転送する流れとしている。

インストール環境

■可視化サーバ

  • OS:CentOS7.4
  • ElasticSearch 6.2
  • Kibana 6.2
  • Nginx 1.12.2
  • Logstash 6.2
  • Java: openjdk1.8.0 161

■Webサーバ(Apache)

  • filebeat 6.2 ←今回追加

事前準備

 Kibana /ElasticSearch /Logstash /Nginx の動作する環境を準備

www.n-novice.com

Filebeat導入

yumでのインストールをrpmを取得したインストールの2つの方法がありそうがだ、

今回はyumで追加を行う。

 ■YUM repository

www.elastic.co

■パッケージダウンロード/インストール

www.elastic.co

Step1.インストール

Webサーバーにfilebeatをインストールを実施する。

パブリックキー取得 ※取得済みの場合は不要
[user@web ~]$ sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
リポジトリ追加 ※作成済みの場合は不要
[user@web ~]$ sudo vi /etc/yum.repos.d/elastic.repo

■■■■ 追加 ■■■■
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
■■■■■■■■■■■■■■■■■
filebeatインストール
[user@web ~]$ sudo yum install -y filebeat

Step2.設定

インストール後の設定(初期値)確認
初期の設定情報確認をしてみる
[user@web ~]$ sudo more /etc/filebeat/filebeat.yml | grep -v '^\s*#' | grep -v '^\s*$'
filebeat.prospectors:
- type: log
enabled: false
paths:
- /var/log/*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
output.elasticsearch:
hosts: ["localhost:9200"]
filebeat.ymlのテンプレート修正

Filebeatの初期テンプレートはElasticsearch出力で使用できるためLogstashを使用するようにFilebeatをテンプレートを修正する

[user@web ~]$ vi /etc/filebeat/filebeat.yml

■■■■■ 修正 ■■■■■
filebeat.prospectors:
- input_type: log
paths:
- /var/log/httpd/access_log*
output.logstash:
hosts: ["192.168.20.176:5044"]
■■■■■■■■■■■■■■■■■■
 構成ファイル(filebeat.yml)テスト
[user@web ~]$ sudo filebeat -configtest -e -c /etc/filebeat/filebeat.yml
Flag --configtest has been deprecated, configtest flag has been deprecated, use test config subcommand
2018-02-27T00:41:54.015+0900 INFO instance/beat.go:468 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]
2018-02-27T00:41:54.018+0900 INFO instance/beat.go:475 Beat UUID: bca4184a-e78d-41c0-be11-28ac704d5567
2018-02-27T00:41:54.018+0900 INFO instance/beat.go:213 Setup Beat: filebeat; Version: 6.2.2
2018-02-27T00:41:54.021+0900 INFO pipeline/module.go:76 Beat name: web.local
2018-02-27T00:41:54.022+0900 WARN [cfgwarn] instance/beat.go:283 DEPRECATED: -configtest flag has been deprecated, use configtest subcommand Will be removed in version: 6.0
Config OK
2018-02-27T00:41:54.022+0900 INFO [monitoring] log/log.go:97 Starting metrics logging every 30s
2018-02-27T00:41:54.025+0900 INFO [monitoring] log/log.go:132 Total non-zero metrics {"monitoring": {"metrics": {"beat":{"cpu":{"system":{"ticks":0,"time":7},"total":{"ticks":140,"time":149,"value":140},"user":{"ticks":140,"time":142}},"info":{"ephemeral_id":"452e3bc2-87bc-4025-89c1-bbc898fc6b35","uptime":{"ms":52}},"memstats":{"gc_next":4473924,"memory_alloc":2690480,"memory_total":2690480,"rss":11464704}},"filebeat":{"harvester":{"open_files":0,"running":0}},"libbeat":{"config":{"module":{"running":0}},"output":{"type":"logstash"},"pipeline":{"clients":0,"events":{"active":0}}},"registrar":{"states":{"current":0}},"system":{"cpu":{"cores":1},"load":{"1":0,"15":0.05,"5":0.01,"norm":{"1":0,"15":0.05,"5":0.01}}}}}}
2018-02-27T00:41:54.026+0900 INFO [monitoring] log/log.go:133 Uptime: 52.802986ms
2018-02-27T00:41:54.026+0900 INFO [monitoring] log/log.go:110 Stopping metrics logging.
[user@web log]$

Step3.filebeat起動

[user@web log]$ sudo systemctl daemon-reload
[user@web log]$ sudo systemctl start filebeat.service
[user@web log]$ sudo systemctl enable filebeat.service
Created symlink from /etc/systemd/system/multi-user.target.wants/filebeat.service to /usr/lib/systemd/system/filebeat.service.
[user@web log]$

 Logstash設定変更

Step1.Logstash設定作成(filebeat連携用)

設定ファイル作成

inpoet :port 5044を開放してデータ転送の待ち受けポートとする。

filter:grokフィルタを使用して Apacheのアクセスログをフィールド毎に分割

   Apacheのログのために、COMBINEDAPACHELOGが用意されているらしいので使ってみる。

output:elasticsearch の"localhost:9200"に出力する。

★設定ファイルの参考先★

www.elastic.co

[user@server001 ~]$ cd /etc/logstash/conf.d
[user@server001 conf.d]$ sudo vi 01-pipeline.conf

■■■■ 追加 ■■■■
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}

■■■■■■■■■■■■■■■■
設定ファイルのテスト① 

”--path.settings /etc/logstash”のオプションがない場合はWARNINGが出力されるみたい。

[user@server001 conf.d]$ sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/01-pipeline.conf --config.test_and_exit
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[INFO ] 2018-02-28 01:00:29.503 [main] scaffold - Initializing module {:module_name=>"fb_apache", :directory=>"/usr/share/logstash/modules/fb_apache/configuration"}
[INFO ] 2018-02-28 01:00:29.509 [main] scaffold - Initializing module {:module_name=>"netflow", :directory=>"/usr/share/logstash/modules/netflow/configuration"}
[WARN ] 2018-02-28 01:00:30.507 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
Configuration OK
[INFO ] 2018-02-28 01:00:32.688 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
[user@server001 conf.d]$
設定ファイルのテスト②
[user@server001 conf.d]$ sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/01-pipeline.conf --config.test_and_exit
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK
[user@server001 conf.d]$
Logstash実行

optionを "--config.reload.automatic" に変更する。

[user@server001 conf.d]$ sudo /usr/share/logstash/bin/logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/01-pipeline.conf --config.reload.automatic
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
[user@elastic ~]$

kibanaでインポート結果確認 

kibanaでの結果確認手順


左メニューの "Management" をクリック

f:id:pocket01:20180228020012p:plain


Managementメニューの "Index Patterns " をクリック

f:id:pocket01:20180228020025p:plain


左メニューの "Index pattern" に"logstash-*"入力

・Your index pattern can match any of your x indices, below.に表示されファイル名を入力でも可能

”Success! Your index pattern matches 1 index."が表示されると"NextStep"をクリックすることができるようになる。

f:id:pocket01:20180228020220p:plain

 ④
Time Filter field nameには”@timestanp"を選択する。

f:id:pocket01:20180228020314p:plain

左メニューのdiscoverをクリックする

f:id:pocket01:20180228020353p:plain

 ⑥

”logstash-2018.02.27”を選ぶといい感じに表とグラフが出力される。

f:id:pocket01:20180228020427p:plain

⑥’

表示項目をadd で追加すると色々な出力形式に変更ができる

f:id:pocket01:20180228020550p:plain

Ex)kibanaの画面(JOSN情報)

COMBINEDAPACHELOGを使用すると以下のように分割れて登録されるみたい。

{
"_index": "logstash-2018.02.27",
"_type": "doc",
"_id": "JOBe2WEB4jh9j1cFRlJa",
"_version": 1,
"_score": null,
"_source": {
"tags": [
"beats_input_codec_plain_applied",
"_geoip_lookup_failure"
],
"referrer": "\"-\"",
"message": "192.168.20.3 - - [28/Feb/2018:01:40:51 +0900] \"GET /favicon.ico HTTP/1.1\" 200 - \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko\"",
"request": "/favicon.ico",
"beat": {
"name": "webserver",
"hostname": "webserver",
"version": "6.2.2"
},
"offset": 8406,
"@version": "1",
"agent": "\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko\"",
"timestamp": "28/Feb/2018:01:40:51 +0900",
"clientip": "192.168.20.3",
"ident": "-",
"auth": "-",
"verb": "GET",
"geoip": {},
"response": "200",
"httpversion": "1.1",
"@timestamp": "2018-02-27T16:40:59.083Z",
"host": "webserver",
"source": "/var/log/httpd/access_log"
},
"fields": {
"@timestamp": [
"2018-02-27T16:40:59.083Z"
]
},
"sort": [
1519749659083
]
}