- Logstash を使って、日々出力されるログを Elasticsearch へと送りたい。
- filter で色々書く必要がある。
- お手軽に、書いた logstash.conf をすぐに試す環境が欲しい。
こんな必要性が出てきましたので、今回、まとめました。
環境
- Docker version 19.03.1, build 74b1e89
- docker-compose version 1.24.1, build 4667896b
logstash.conf を試しながら作り上げるための Docker Compose の Logstash 環境を書く
Docker Compose は使わなくとも実現可能と思います。
しかし、 Docker コンテナにプラグインをインストールしたくなったりなどの場合にカスタマイズできる方が便利です。また、ファイル共有周りを考えると Windows でも動かしやすいので、 Docker Compose を今回は使いました。
参考ページ
ディレクトリ構成
logstash/pipeline/logstash.conf
: 本投稿でメインとなるファイルです。これを修正して設定ファイルを作り上げていくことになります。log/
: 今は何も入っていませんが、ここに Logstash に取り込ませるログファイルを入れる想定です。logstash/Dockerfile
: logstash コンテナにプラグインをインストールしたくなった時に編集します。
$ tree
.
├── docker-compose.yml
├── log
└── logstash
├── Dockerfile
└── pipeline
└── logstash.conf
3 directories, 3 files
docker-compose.yml
version: '3.5'
services:
logstash:
build:
context: ./logstash
volumes:
- ./logstash/pipeline/:/usr/share/logstash/pipeline/
- ./log/:/tmp/log/
logstash/Dockerfile
FROM docker.elastic.co/logstash/logstash-oss:7.3.1
logstash/pipeline/logstash.conf
input { stdin { } }
output {
stdout { codec => rubydebug }
}
必要最低限の logstash.conf を試す。
標準入力を受付け、それを Logstash が処理し、標準出力で表示する logstash.conf を作りました。
これがうまくいけば、正常に動作する Logstash を手に入れたことになります。そうすれば、あとは logstash.conf を編集していけば望む設定を作り上げることができるようになります。
まずはビルドして、 Logstash の Docker コンテナを動かす準備をします。
$ docker-compose build
Building logstash
Step 1/1 : FROM docker.elastic.co/logstash/logstash-oss:7.3.1
7.3.1: Pulling from logstash/logstash-oss
48914619bcd3: Pull complete
1ec1752ed00c: Pull complete
9ff6a8bb72cf: Pull complete
69314731c254: Pull complete
411c55b8435e: Pull complete
62c2c0193588: Pull complete
bd8f3f8bd64e: Pull complete
65fe1ade3dce: Pull complete
6ce774c8d0d8: Pull complete
6fb93f8f50a9: Pull complete
c82f663c9e12: Pull complete
Digest: sha256:4cab9806dd444bcb6c8f0952db31d4c9d0951a0c4935d4c463c71f618da4e72b
Status: Downloaded newer image for docker.elastic.co/logstash/logstash-oss:7.3.1
---> 2aec9dd4b712
Successfully built 2aec9dd4b712
Successfully tagged sample_logstash_logstash:latest
$
起動します。その後、 started Logstash API endpoint {:port=>9600}
が表示されたら、適当に入力して Enter 。今回は、 aiueo
としました。すると、
{
"host" => "0c447dc1370c",
"message" => "aiueo",
"@version" => "1",
"@timestamp" => 2019-08-24T02:23:40.305Z
}
と Logstash が処理した出力が返ってきました。成功です!
実施時は次のようになります。
$ docker-compose run --rm logstash
Creating network "sample_logstash_default" with the default driver
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.7.0.jar) to field java.io.FileDescriptor.fd
WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Thread.exclusive is deprecated, use Thread::Mutex
Sending Logstash logs to /usr/share/logstash/logs which is now configured via log4j2.properties
[2019-08-24T02:23:32,819][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"}
[2019-08-24T02:23:32,838][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/share/logstash/data/dead_letter_queue"}
[2019-08-24T02:23:33,290][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.3.1"}
[2019-08-24T02:23:33,315][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"e1c3ead7-f443-4b97-820f-6a50c9a72842", :path=>"/usr/share/logstash/data/uuid"}
[2019-08-24T02:23:34,522][INFO ][org.reflections.Reflections] Reflections took 65 ms to scan 1 urls, producing 19 keys and 39 values
[2019-08-24T02:23:35,171][WARN ][org.logstash.instrument.metrics.gauge.LazyDelegatingGauge] A gauge metric of an unknown type (org.jruby.RubyArray) has been create for key: cluster_uuids. This may result in invalid serialization. It is recommended to log an issue to the responsible developer/development team.
[2019-08-24T02:23:35,176][INFO ][logstash.javapipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>500, :thread=>"#<Thread:0x3022c4ec run>"}
[2019-08-24T02:23:35,268][INFO ][logstash.javapipeline ] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2019-08-24T02:23:35,355][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2019-08-24T02:23:35,637][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
aiueo
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"host" => "0c447dc1370c",
"message" => "aiueo",
"@version" => "1",
"@timestamp" => 2019-08-24T02:23:40.305Z
}
^C[2019-08-24T02:23:45,770][WARN ][logstash.runner ] SIGINT received. Shutting down.
[2019-08-24T02:23:45,963][INFO ][logstash.javapipeline ] Pipeline terminated {"pipeline.id"=>"main"}
[2019-08-24T02:23:46,010][INFO ][logstash.runner ] Logstash shut down.
$
logstash.conf を編集していく
ログファイルを log/
に配置します。
そして、最低限の logstash.conf を少し編集し、その後 docker-compose run --rm logstash
で結果を確認し、また編集し、を繰り返していきます。
次のページが役立ちました。
- Logstash Configuration Examples | Logstash Reference [7.3] | Elastic
- LogstashでのGrokの始め方 – Qiita
- 既存の Gork パターンを積極的に使う。
- 複数行で 1 つのログの場合。 [logstash 複数行] などで検索する。
- ログの日時を date 型に変換する
おわりに
Elasticsearch にログを送ることになりました。デフォルトではログの1行が message というキーの値として送信されます。
これでは後ほど Kibana などで分析する時にやりにくいです。そこで今回のように logstash.conf を編集すればよいわけですけれども。。。
Logstash には明るくないため、一つ一つ確認しながら作り上げていきたかったのです。
ですので、そのようなことができる環境づくりについて、本投稿ではまとめました。
以上です。