22

複数のサーバーに散在するドッキングされたアプリケーションのセットがあり、ELK を使用して本番レベルの集中​​ログをセットアップしようとしています。ELK 部分自体には問題ありませんが、ログをログスタッシュに転送する方法について少し混乱しています。負荷分散機能があるため、Filebeat を使用しようとしています。また、Filebeat (またはその他のもの) をすべての Docker にパックすることを避け、Docker 化するかどうかにかかわらず、分離したままにします。

どうすれば続行できますか?

私は次のことを試してきました。私のDockersはstdoutにログオンするので、docker化されていないFilebeatがstdinから読み取るように構成されているため、次のようにします。

docker ログ -f mycontainer | ./filebeat -e -c filebeat.yml

それは最初はうまくいくようです。最初のログはログスタッシュに転送されます。私が推測するキャッシュされたもの。しかし、ある時点でスタックし、同じイベントを送信し続けます

それは単なるバグですか、それとも間違った方向に向かっていますか? どのようなソリューションをセットアップしましたか?

4

6 に答える 6

9

Docker では、使用中のlogDriverを指定できます。この回答は、Filebeat や負荷分散を気にしません。

プレゼンテーションでは、syslog を使用して、ポート 5000 でリッスンしている Logstash (ELK) インスタンスにログを転送しました。次のコマンドは、syslog を介して常にメッセージを Logstash に送信します。

docker run -t -d --log-driver=syslog --log-opt syslog-address=tcp://127.0.0.1:5000 ubuntu /bin/bash -c 'while true; do echo "Hello $(date)"; sleep 1; done'
于 2015-10-30T10:00:36.270 に答える
8

filebeat を使用するとdocker logs、説明したように出力をパイプするだけです。表示されている動作は間違いなくバグのように聞こえますが、部分的な行読み取り構成がヒットしている可能性もあります (改行記号が見つかるまで部分的な行を再送信します)。

配管で見られる問題は、logstash が利用できない場合に発生する可能性のある背圧です。filebeat はイベントを送信できない場合、イベントを内部的にバッファリングし、ある時点で stdin からの読み取りを停止します。ドッカーがstdoutが応答しなくなるのをどのように/保護するかはわかりません。パイピングに関するもう 1 つの問題は、docker-compose を使用している場合、filebeat + docker の再起動動作である可能性があります。docker-compose はデフォルトで画像と画像の状態を再利用します。そのため、再起動すると、古いログがすべて再送信されます (基になるログ ファイルがまだローテーションされていない場合)。

パイピングする代わりに、docker によってホスト システムに書き込まれたログ ファイルの読み取りを試みることができます。デフォルトの docker ログ ドライバーはjson ログ ドライバーです。. ログローテーションを実行し、いくつかの古いファイルを保持するように json ログドライバーを構成できますし、構成する必要があります (ディスクにバッファリングするため)。max-size および max-file オプションを参照してください。json ドライバーは、ログに記録される行ごとに 1 行の「json」データを配置します。Docker ホスト システムでは、ログ ファイルは /var/lib/docker/containers/container_id/container_id-json.log に書き込まれます。これらのファイルは、filebeat によって logstash に転送されます。logstash またはネットワークが使用できなくなった場合、または filebeat が再起動された場合、ログの行が残った場所から引き続き転送されます (ログのローテーションのためにファイルが削除されていない場合)。イベントが失われることはありません。logstash では、json_lines コーデックまたはフィルターを使用して json 行を解析し、grok フィルターを使用してログからさらに情報を取得できます。

libbeat (filebeat がログ ファイルを送信するために使用) を使用して新しいログ ドライバーを docker に追加することについて、いくつかの議論がありました。将来的には、 docker logs api を使用して dockerbeat経由でログを収集できるようになるかもしれません (logs api を利用する計画はまだありません)。

syslog の使用もオプションです。おそらく、docker ホストの負荷分散ログ イベントで syslog リレーを取得できます。または、syslog にログ ファイルを書き込み、filebeat を使用してそれらを転送します。rsyslog には、少なくともいくつかのフェイルオーバー モードがあると思います。アクティブな logstash インスタンスが利用できなくなった場合に備えて、logstash syslog 入力プラグインと rsyslog を使用して、フェイルオーバー サポートを使用してログを logstash に転送できます。

于 2015-11-20T13:59:36.573 に答える
7

Docker API を使用して独自の Docker イメージを作成し、マシン上で実行されているコンテナーのログを収集して、Filebeat のおかげで Logstash に送信しました。ホストに何かをインストールまたは構成する必要はありません。

https://hub.docker.com/r/bargenson/filebeat/を確認して、ニーズに合っているかどうか教えてください。

コードはこちらから入手できます: https://github.com/bargenson/docker-filebeat

于 2016-02-07T06:17:47.930 に答える
0

これを行う必要がある他の人を支援するためだけに、Filebeat を使用してログを送信できます。@brice-argenson のコンテナーを使用しますが、SSL サポートが必要だったので、ローカルにインストールされた Filebeat インスタンスを使用しました。

filebeat のプロスペクターは次のとおりです (他のコンテナーについても繰り返します)。

- input_type: log
  paths:
    - /var/lib/docker/containers/<guid>/*.log
  document_type: docker_log
  fields:
    dockercontainer: container_name

更新時に変更される可能性があるため、GUID を知る必要があるのは少し面倒です。

logstash サーバーで、logstash の通常の filebeat 入力ソースをセットアップし、次のようなフィルターを使用します。

filter {
  if [type] == "docker_log" {
    json {
      source => "message"
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    mutate {
      rename => { "log" => "message" }
    }
    date {
      match => [ "time", "ISO8601" ]
    }
  }
}

これにより、Docker ログから JSON が解析され、タイムスタンプが Docker によって報告されたものに設定されます。

nginx Docker イメージからログを読み取る場合は、次のフィルターも追加できます。

filter {
  if [fields][dockercontainer] == "nginx" {
    grok {
      match => { "message" => "(?m)%{IPORHOST:targethost} %{COMBINEDAPACHELOG}" }
    }
    mutate {
      convert => { "[bytes]" => "integer" }
      convert => { "[response]" => "integer" }
    }
    mutate {
      rename => { "bytes" => "http_streamlen" }
      rename => { "response" => "http_statuscode" }
    }
  }
}

変換/名前変更はオプションですが、COMBINEDAPACHELOGこれらの値を整数にキャストしない式の見落としが修正され、Kibana での集約に使用できなくなります。

于 2016-11-25T09:25:10.013 に答える