1. logstash パイプライン構成ファイル logstash.conf を表示します。
cd ~/elk/logstash/pipeline/
cat logstash.conf
デフォルトの構成ファイル入力は Beat です。Beat
は ELK スタックのコア コンポーネントである Beats を意味します。Beats は
軽量データ コレクターを指し、一連の Beats の総称です。公式 Web サイト上の現在の Beats は次のとおりです。
ログやその他のデータを収集するためのFilebeat の
軽量コレクター
Metricbeat
軽量インジケーターデータコレクター
Packetbeat
軽量ネットワーク データ コレクター
Winlogbeat
軽量 Windows イベント ログ コレクター
Auditbeat
軽量監査データ コレクター
Heartbeat
は、ステータス監視を実行するための軽量のコレクターです
。ログ システムの構築に使用されるビートは filebeat です。filebeat が logstash に接続するために、
シンプルな Elk ログ システムを構築するための関連設定が docker にあります4.
デフォルトの設定ファイル出力は stdout です;
stdout (標準出力)、つまり、beat によって送信されたデータはデフォルトでコンソールに出力されます。
2. logstash のデフォルト出力を変更する
filebeat によって収集されたログは logstash に送信されます。logstash の処理後、ログをディスクに永続化するために elasticsearch に送信する必要があります。これは、その後の表示や分析に便利です (vim ~/elk /logstash/pipeline/logstash)
。 conf
が出力に追加されます
elasticsearch {
hosts => ["https://192.168.182.128:9200"]
index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
user => "elastic"
password => "+4TMJBgOpjdgH+1MJ0nC"
}
Logstash.yml 関連の構成
ホスト: elasticsearch のアドレス、https を使用、 logstash.yml
の構成インデックスと同じ: インデックス、elasticsearch に保存されているすべてのデータはインデックス ([fields][env] および [fields][ application]は filebeat に追加されたカスタム フィールドです)
cacert: elasticsearch 証明書; logstash.yml の同じ設定ユーザー
: elasticsearch アカウント; logstash.yml の同じ設定パスワード
: 上記のユーザーに対応するパスワード; logstash.yml の同じ設定
3.logstashを再起動します
docker restart logstash
4. filebeat が収集するログを生成する
ここでエラー ログが生成されます。
logstash ログを表示します。
docker logs -f --tail 200 logstash
5. kibana にログインして、インデックスが生成されているかどうかを確認します。
ここでは、dev-test-2023.04.18 という名前のインデックスが生成されます。
このインデックスは、logstash.conf のインデックス構成によって生成されます。
index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
{[fields][env]} と %{[fields][application]} は、それぞれ json データの fileds.env フィールドと fileds.application フィールドを取得することを示します。 fileds.env と fileds.application は filebeat 構成で設定されます
%
{ +YYYY.MM.dd} は現在の日付を取得することを意味します。インデックス名で現在の日付を動的に取得することは、毎日生成されるログが elasticsearch の別のインデックスに対応することを意味します。
6. Kiban でログを表示する
ビュー名は、dev-test-* を使用して、dev-test- で始まるすべてのインデックスと一致します。
ここでのドキュメントは、生成されたログに対応します。
このドキュメントのフィールドには、ログ自体以外に、重要ではない多くのフィールドが含まれている可能性があります。
左側でフィルタリングできます 表示したいフィールドを決定しますメッセージ
フィールドを見つけて追加します
このとき表示される内容は生成されたログです
生成されたログは内容の多いエラーログであり、そうではありませんここでは折りたたまれて表示されます。ログの線幅を適応的に設定します。
7. logstash.conf 出力構成にアクション構成を追加します。
action => "create" を設定すると、データ ストリームが生成され、データ ストリームの下のバックアップ インデックスがインデックスのエイリアスと同様の実際のインデックスになります。データ ストリームの設定は主に、インデックスのライフ サイクルを設定すると、ログは継続的に生成されます。ただし、ディスクのリソースには限りがあるため、インデックスのライフ サイクルを設定し、古いログを自動的に削除して、新しいログ用のスペースを確保する必要があります。その方法インデックスのライフサイクルの設定については後で説明します
データ ストリームの命名形式は通常、
構成ファイルを変更するための「ログ - アプリケーション名 - 環境」です。
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["https://192.168.182.128:9200"]
#index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
index =>"logs-%{[fields][application]}-%{[fields][env]}"
action => "create"
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
user => "elastic"
password => "+4TMJBgOpjdgH+1MJ0nC"
}
stdout {
codec => rubydebug
}
}
8. logstash を再起動し、新しいログを生成し、logstash ログを表示します。
docker restart logstash
docker logs -f logstash
プログラム ログ出力
logstash ログ
データ フローが elasticsearch に表示される
9. 前の方法に従ってデータ ビューを作成します。
生成された 3 つのログからDiscover を通じてビューを確認すると
、問題が見つかりました。ここでのデフォルトの並べ替えは、@timestamp フィールドに従って逆順になっていますが、ログが生成された順序によれば、上位 2 つは正の順序になっています。上の 2 つのログと 3 番目のログは逆の順序で配置されているため、
ログが混乱して見える場合があります。この現象の理由は、@timestamp フィールドが filebeat がログを収集する時刻であるのに、filebeat がログを収集するのは時間だけではないためです。アプリケーションがログを生成するため、1 つの部分を収集しますが、バッチごとに収集します。つまり、上位 2 つのログが同じバッチで収集され、同じバッチ内のログの順序とログ内の時間を区別できません。はログが生成されたときのリアルタイム、@timestamp はログを収集する時刻であるため、
解決すべき問題はログから実際のログ生成時刻を抽出し、それを @timestamp フィールドに設定することです。ログから、ログを分割する必要があります
10. ログフィールドの分割
Java ログは通常、固定フォーマットを持っており、次のログのように、リレーショナル データベースと同様に、各ログをフォーマットに従って固定数のフィールドに分割できます
。
2023-04-21 17:09:36.394 ERROR [xcoa,,] 23072 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-2 - Exception during pool initialization.
2023-04-21 17:09:36.394 => ログ生成時刻
ERROR => ログレベル
[xcoa,] => コンテキストおよびその他の情報
23072 => プロセス ID
[main] => スレッド名
com.zaxxer.hikari.pool.ヒカリプール =>クラス名
ヒカリプール-2 - プールの初期化中の例外 =>ログの内容
このログの場合、logstash は次の grok 式に従って照合できます。
(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}
分割フィールドは次のとおりです。
log-time:日志产生时间
log-level:日志级别
application :上下文等信息
pid:进程id
thread:线程名
class:类名
log-message.:日志内容
logstash設定に対応
input {
beats {
port => 5044
}
}
filter{
grok{
match => {
"message" => "(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}"
}
}
}
output {
elasticsearch {
hosts => ["https://192.168.182.128:9200"]
#index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
index =>"logs-%{[fields][application]}-%{[fields][env]}"
action => "create"
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
user => "elastic"
password => "+4TMJBgOpjdgH+1MJ0nC"
}
stdout {
codec => rubydebug
}
}
11. ログフィールド分割効果テスト
ログスタッシュを再起動します
docker restart logstash
kibana で表示するログを生成します
(フィールド リストに分割フィールドがすでに表示されており、後でこれらのフィールドを使用してフィルタリングできます)
12. ログは生成時間順にソートされます
ログ生成時刻は分割されて log-time フィールドに配置されている
ため、必要なのは @timestamp を log-time フィールドの内容で上書きし、
logstash.conf のフィルターに構成を追加することです。
date {
match => ["log-time", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601"] #原字段转换成时间类型
locale => "en"
target => [ "@timestamp" ] #目标字段
timezone => "Asia/Shanghai"
}
ここでの設定は、ログ時刻をフォーマットに従って時刻型に変換し、それを @timestamp フィールドに上書きすることです。
元の @timestamp を保持したい場合は、元の @timestamp 値を新しいフィールドに割り当てることができます。
次の構成では、@timestamp を新しいフィールド collection_time に設定します。
ruby {
code => "event.set('collection_time', event.get('@timestamp'))"
}
完全な構成は次のとおりです。
input {
beats {
port => 5044
}
}
filter{
grok{
match => {
"message" => "(?m)^%{TIMESTAMP_ISO8601:log-time}\s+%{LOGLEVEL:log-level}\s+\[%{DATA:application}\]\s+%{INT:pid}\s+---\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:log-message}"
}
}
ruby {
code => "event.set('collection_time', event.get('@timestamp'))"
}
date {
match => ["log-time", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601"]
locale => "en"
target => [ "@timestamp" ]
timezone => "Asia/Shanghai"
}
}
output {
elasticsearch {
hosts => ["https://192.168.182.128:9200"]
#index => "%{[fields][env]}-%{[fields][application]}-%{+YYYY.MM.dd}"
index =>"logs-%{[fields][application]}-%{[fields][env]}"
action => "create"
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
user => "elastic"
password => "+4TMJBgOpjdgH+1MJ0nC"
}
stdout {
codec => rubydebug
}
}
13. 効果試験
ログスタッシュを再起動します
docker restart logstash
ログを生成する
kibana で新しく生成されたログを確認します。
新しく生成されたログの @timestamp 値が一貫していることがわかります。@timestampを使用してもログの乱れの問題は発生しません