エラスティック スタックを使用したログ記録

ヒント

このコンテンツは eBook の「Azure 向けクラウド ネイティブ .NET アプリケーションの設計」からの抜粋です。.NET Docs で閲覧できるほか、PDF として無料ダウンロードすると、オンラインで閲覧できます。

Cloud Native .NET apps for Azure eBook cover thumbnail.

優れた一元化されたログ ツールは多数あり、無料のオープンソース ツールから高価なオプションまでコストもさまざまです。 多くの場合、無料のツールは有料のものと同等かそれよりも優れています。 このようなツールの 1 つが、Elasticsearch、Logstash、Kibana の 3 つのオープンソース コンポーネントを組み合わせたものです。

これらのツールをまとめて、Elastic Stack または ELK スタックと呼びます。

Elastic Stack

Elastic Stack は、Kubernetes クラスターから情報を収集するための強力なオプションです。 Kubernetes では、Elasticsearch エンドポイントへのログの送信がサポートされています。ほとんどの場合、図 7-5 に示すように、環境変数を設定するだけで始めることができます。

KUBE_LOGGING_DESTINATION=elasticsearch
KUBE_ENABLE_NODE_LOGGING=true

図 7-5。 Kubernetes の構成変数

この手順では、Elasticsearch をクラスターにインストールして、すべてのクラスター ログをそれに送信することを目標とします。

An example of a Kibana dashboard showing the results of a query against logs ingested from Kubernetes図 7-6。 Kibana ダッシュボードに Kubernetes から取り込んだログに対するクエリの結果が表示されている例

Elastic Stack の利点とは

Elastic Stack により、低コストでスケーラブルな、クラウドに適した方法で、一元化されたログが提供されます。 そのユーザー インターフェイスを使用すると、データ分析が効率化されるため、扱いにくいインターフェイスと格闘する代わりに、データから分析情報を収集することに時間を費やすことができます。 多種多様の入力がサポートされているため、ご自分の分散型アプリケーションがさまざまな種類のサービスにまたがっていても、ログやメトリック データをシステム内に引き続きフィードできることを期待できます。 また、Elastic Stack では大規模なデータ セットにまたがる高速検索もサポートされており、大規模なアプリケーションでも、詳細なデータをログに記録し、なおもパフォーマンスの高い方法でそれを可視化することができます。

Logstash

最初のコンポーネントは Logstash です。 このツールは、多種多様なソースからログ情報を収集するために使用されます。 たとえば、Logstash では、ディスクからログを読み取り、Serilog などのログ ライブラリからメッセージを受信することもできます。 Logstash では、ログの受信時に基本的なフィルター処理と拡張を行うことができます。 たとえば、ログに IP アドレスが含まれている場合は、地理的な検索を行い、そのメッセージの発信元の国または都市まで取得するように Logstash を構成できます。

Serilog は .NET 言語のログ ライブラリで、これにより、パラメーター化されたログが可能になります。 フィールドを埋め込むテキスト ログ メッセージを生成する代わりに、パラメーターが個別に保持されます。 このライブラリを使用すると、よりインテリジェントなフィルター処理と検索が可能になります。 Logstash に書き込むためのサンプルの Serilog 構成を図 7-7 に示します。

var log = new LoggerConfiguration()
         .WriteTo.Http("http://localhost:8080")
         .CreateLogger();

図 7-7。 ログ情報を HTTP 経由で logstash に直接書き込むための Serilog 構成

Logstash では、図 7-8 に示すような構成を使用します。

input {
    http {
        #default host 0.0.0.0:8080
        codec => json
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        index=>"sales-%{+xxxx.ww}"
    }
}

図 7-8。 Serilog からログを使用するための Logstash 構成

大規模なログ操作が必要ないシナリオでは、Beats と呼ばれる Logstash の代替手段があります。 Beats は、ログからネットワーク データやアップタイム情報まで、多種多様のデータを収集できるツール ファミリです。 Logstash と Beats の両方が、多くのアプリケーションによって使用されます。

ログが Logstash によって収集されたら、それらを配置する場所が必要です。 Logstash では多くの異なる出力がサポートされていますが、より興味深いものの 1 つが Elasticsearch です。

Elasticsearch

Elasticsearch は、ログの受信時にインデックスを作成できる強力な検索エンジンです。 ログに対するクエリの実行が迅速になります。 Elasticsearch は膨大な量のログを処理でき、極端な場合は、多数のノードにわたってスケールアウトできます。

ログ メッセージが、パラメーターを含むように作成されている、または Logstash 処理によってパラメーターが分割されている場合、この情報は Elasticsearch によって保持されるため、直接照会できます。

jill@example.com がアクセスした上位 10 ページを検索するクエリを図 7-9 に示します。

"query": {
    "match": {
      "user": "jill@example.com"
    }
  },
  "aggregations": {
    "top_10_pages": {
      "terms": {
        "field": "page",
        "size": 10
      }
    }
  }

図 7-9。 ユーザーがアクセスした上位 10 ページを検索する Elasticsearch クエリ

Kibana Web ダッシュボードを使用して情報を視覚化する

スタックの最後のコンポーネントは Kibana です。 このツールは、Web ダッシュボードで対話型の視覚化を提供するために使用されます。 ダッシュボードは、技術者でないユーザーでも作成できます。 Elasticsearch インデックス内に存在するほとんどのデータを Kibana ダッシュボードに含めることができます。 個々のユーザーが異なるダッシュボードを希望する可能性があり、このカスタマイズは、Kibana によってユーザー固有のダッシュボードが許可されることで実現されます。

Azure に Elastic Stack をインストールする

Elastic Stack は、さまざまな方法で Azure にインストールできます。 いつものように、仮想マシンをプロビジョニングし、それらに Elastic Stack を直接インストールすることができます。 最も高いカスタマイズ性が提供されるため、このオプションは経験豊富なユーザーに好まれます。 サービスとしてのインフラストラクチャにデプロイすると、管理オーバーヘッドが大きくなり、その道を選択した場合、マシンのセキュリティ保護やパッチで最新状態を維持するなど、サービスとしてのインフラストラクチャに関連するすべてのタスクを自分で行わなければなりません。

オーバーヘッドが少ないオプションは、Elastic Stack が既に構成されている多くの Docker コンテナーの 1 つを使用することです。 これらのコンテナーは、既存の Kubernetes クラスターにドロップして、アプリケーション コードと共に実行できます。 sebp/elk コンテナーは十分なドキュメント化が行われ、テスト済みの Elastic Stack コンテナーです。

もう 1 つのオプションは、最近発表されたサービスとしての ELK オファリングです。

リファレンス