Docker はシンプルな Elk ログ システム 5 (logstash パイプライン構成ファイル logstash.conf) を構築します。

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を使用してもログの乱れの問題は発生しません

おすすめ

転載: blog.csdn.net/weixin_44835704/article/details/130224040