I.はじめに
Logstash は、リアルタイム データ送信機能を備えたオープンソース データ収集エンジンです。さまざまなソースからのデータを均一にフィルタリングし、開発者の仕様に従って宛先に出力できます。
名前が示すように、Logstash はログ ファイルであるデータ オブジェクトを収集します。ログ ファイルのソース (システム ログ、サーバー ログなど) が多数あり、内容が乱雑であるため、人間が観察するのは不便です。したがって、Logstash を使用すると、ログ ファイルを一元的に収集およびフィルタリングし、開発者や運用保守担当者が観察しやすい可読性の高いコンテンツに変換し、システム/プロジェクトのパフォーマンスを効果的に分析できます。運用、監視、早期警戒をしっかり行う 準備等
2. インストール
Logstash は JDK1.8 に依存しているため、インストール前にマシンに JDK1.8 がインストールされ、構成されていることを確認してください。
tar -zxvf logstash-5.6.3.tar.gz -C /usr
cd logstash-5.6.3
3. 構成
Logstash はパイプラインを通じて動作します。パイプラインには、入力と出力という 2 つの必須要素と、オプションの要素であるフィルターがあります。
入力プラグインはデータ ソースからデータを取得し、フィルター プラグインはユーザー指定のデータ形式に従ってデータを変更し、出力プラグインはデータを宛先に書き込みます。以下に示すように:
簡単なケースから始めましょう:
bin/logstash -e 'input { stdin { } } output { stdout {} }'
Logstash を起動した後、もう一度 Hello World と入力すると、結果は次のようになります。
[root@localhost logstash-5.6.3]# bin/logstash -e 'input { stdin { } } output { stdout {} }'
Sending Logstash's logs to /usr/logstash-5.6.3/logs which is now configured via log4j2.properties
[2017-10-27T00:17:43,438][INFO ][logstash.modules.scaffold] Initializing module {
:module_name=>"fb_apache", :directory=>"/usr/logstash-5.6.3/modules/fb_apache/configuration"}
[2017-10-27T00:17:43,440][INFO ][logstash.modules.scaffold] Initializing module {
:module_name=>"netflow", :directory=>"/usr/logstash-5.6.3/modules/netflow/configuration"}
[2017-10-27T00:17:43,701][INFO ][logstash.pipeline ] Starting pipeline {
"id"=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>125}
[2017-10-27T00:17:43,744][INFO ][logstash.pipeline ] Pipeline main started
The stdin plugin is now waiting for input:
[2017-10-27T00:17:43,805][INFO ][logstash.agent ] Successfully started Logstash API endpoint {
:port=>9600}
Hello World
2017-10-27T07:17:51.034Z localhost.localdomain Hello World
Logstash パイプライン (フィルタリング) を介した Hello World (入力) は、2017-10-27T07:17:51.034Z localhost.localdomain Hello World (出力) になります。
運用環境では、Logstash のパイプラインはより複雑になり、複数の入力、フィルター、出力プラグインの構成が必要になる場合があります。
したがって、入力、フィルタ、および出力関連の構成を管理するには、構成ファイルが必要です。設定ファイルの内容の形式は次のとおりです。
# 输入
input {
...
}
# 过滤器
filter {
...
}
# 输出
output {
...
}
必要に応じて、入力プラグイン、フィルター プラグイン、出力プラグイン、コーデック プラグインを対応する位置に設定するだけです。
4番目、プラグインの使用法
プラグインを使用する前に、イベントという概念を理解しましょう。
Logstash がデータを読み取るたびに、それがイベントと呼ばれます。
Logstash ディレクトリに logstash.conf という名前の構成ファイルを作成します (任意の名前を付けます)。
4.1 入力プラグイン
入力プラグインを使用すると、特定のイベント ソースを Logstash パイプラインに読み込んで入力 {} で構成でき、複数のイベント ソースを設定できます。
構成ファイルを変更します。
input {
# 从文件读取日志信息
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
# filter {
#
# }
output {
# 标准输出
stdout {
codec => rubydebug }
}
このうちメッセージはシステムログです。
文書を保存します。タイプ:
bin/logstash -f logstash.conf
コンソールの結果は次のようになります。
{
"@version" => "1",
"host" => "localhost.localdomain",
"path" => "/var/log/messages",
"@timestamp" => 2017-10-29T07:30:02.601Z,
"message" => "Oct 29 00:30:01 localhost systemd: Starting Session 16 of user root.",
"type" => "system"
}
......
4.2 出力プラグイン
出力プラグインは、出力 {} で設定された特定の宛先にイベント データを送信します。複数の宛先を設定できます。
構成ファイルを変更します。
input {
# 从文件读取日志信息
file {
path => "/var/log/error.log"
type => "error"
start_position => "beginning"
}
}
# filter {
#
# }
output {
# 输出到 elasticsearch
elasticsearch {
hosts => ["192.168.2.41:9200"]
index => "error-%{+YYYY.MM.dd}"
}
}
このうち、error.logの内容形式は以下のとおりです。
2017-08-04 13:57:30.378 [http-nio-8080-exec-1] ERROR c.g.a.global.ResponseResultAdvice -设备数据为空
com.light.pay.common.exceptions.ValidationException: 设备数据为空
at com.light.pay.common.validate.Check.isTrue(Check.java:31)
at com.light.attendance.controllers.cloudApi.DevicePushController.deviceInfoPush(DevicePushController.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
2017-08-04 13:57:44.495 [http-nio-8080-exec-2] ERROR c.g.a.global.ResponseResultAdvice -Failed to invoke remote method: pushData, provider: dubbo://192.168.2.100:20880/com.light.attendance.api.DevicePushApi?application=salary-custom&default.check=false&default.timeout=30000&dubbo=2.8.4&interface=com.light.attendance.api.DevicePushApi&methods=getAllDevices,getDeviceById,pushData&organization=com.light.attendance&ow
......
elasticsearch 出力プラグインは構成ファイルで使用されます。出力されたログ情報は Elasticsearch に保存され、インデックス名は、index パラメーターで設定された形式になります。
Elasticsearch の基本的な内容がわからない場合は、このサイトの記事「Elasticsearch の基本入門」を参照するか、Baidu で自分で知識を補うことができます。
文書を保存します。タイプ:
bin/logstash -f logstash.conf
ブラウザを開いてhttp://192.168.2.41:9100にアクセスし、head プラグインを使用して Elasticsearch データを表示すると、結果は次のようになります。
注意:ファイル入力プラグインは、デフォルトで「\n」を使用してログ内の各行の境界位置を決定します。error.log は作成者が編集したエラーログですが、以前はログ内容をコピペする際に内容の最後に改行を入れるのを忘れてしまい、Elasticsearch にログデータをインポートできませんでした。ここで読者はこの重要な点を思い出してください。
4.3 コーデックプラグイン
コーデック プラグインは本質的にストリーム フィルターであり、入力プラグインまたは出力プラグインとともに使用されます。
上図から、Java の例外ログが 1 行のイベントレコードに分割されて Elasticsearch に記録されており、開発者や運用保守担当者の閲覧習慣に沿っていないという問題が分かりました。したがって、ログ情報をエンコードして複数行のイベントを単一行のイベントに変換して記録する必要があります。
マルチライン コーデック プラグインを設定する必要があります。このプラグインは、複数行のログ情報を 1 行に結合し、イベントとして処理できます。
Logstash にはデフォルトではこのプラグインがインストールされていないため、開発者は自分でインストールする必要があります。タイプ:
bin/logstash-plugin install logstash-codec-multiline
構成ファイルを変更します。
input {
# 从文件读取日志信息
file {
path => "/var/log/error.log"
type => "error"
start_position => "beginning"
# 使用 multiline 插件
codec => multiline {
# 通过正则表达式匹配,具体配置根据自身实际情况而定
pattern => "^\d"
negate => true
what => "previous"
}
}
}
# filter {
#
# }
output {
# 输出到 elasticsearch
elasticsearch {
hosts => ["192.168.2.41:9200"]
index => "error-%{+YYYY.MM.dd}"
}
}
文書を保存します。タイプ:
bin/logstash -f logstash.conf
head プラグインを使用して Elasticsearch データを表示すると、結果は次のようになります。
4.4 フィルタープラグイン
フィルター プラグインは Logstash パイプラインの途中に位置し、イベントのフィルター処理を行います。フィルター {} で設定され、複数の設定が可能です。
このテストでは grok プラグインのデモを使用します。grok プラグインは、乱雑なコンテンツをフィルタリングし、構造化し、可読性を高めるために使用されます。
インストール:
bin/logstash-plugin install logstash-filter-grok
構成ファイルを変更します。
input {
stdin {
}
}
filter {
grok {
match => {
"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER
:duration}" }
}
}
output {
stdout {
codec => "rubydebug"
}
}
文書を保存します。タイプ:
bin/logstash -f logstash.conf
起動が成功したら、次のように入力します。
55.3.244.1 GET /index.html 15824 0.043
コンソールは以下を返します:
[root@localhost logstash-5.6.3]# bin/logstash -f logstash.conf
Sending Logstash's logs to /root/logstash-5.6.3/logs which is now configured via log4j2.properties
[2017-10-30T08:23:20,456][INFO ][logstash.modules.scaffold] Initializing module {
:module_name=>"fb_apache", :directory=>"/root/logstash-5.6.3/modules/fb_apache/configuration"}
[2017-10-30T08:23:20,459][INFO ][logstash.modules.scaffold] Initializing module {
:module_name=>"netflow", :directory=>"/root/logstash-5.6.3/modules/netflow/configuration"}
[2017-10-30T08:23:21,447][INFO ][logstash.pipeline ] Starting pipeline {
"id"=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>125}
The stdin plugin is now waiting for input:
[2017-10-30T08:23:21,516][INFO ][logstash.pipeline ] Pipeline main started
[2017-10-30T08:23:21,573][INFO ][logstash.agent ] Successfully started Logstash API endpoint {
:port=>9600}
55.3.244.1 GET /index.html 15824 0.043
{
"duration" => "0.043",
"request" => "/index.html",
"@timestamp" => 2017-10-30T15:23:23.912Z,
"method" => "GET",
"bytes" => "15824",
"@version" => "1",
"host" => "localhost.localdomain",
"client" => "55.3.244.1",
"message" => "55.3.244.1 GET /index.html 15824 0.043"
}
入力は、対応する名前と照合されます。