web-dev-qa-db-ja.com

独自のインデックスで.NET Core Web APIからElasticsearchにログインする方法

C#Elasticsearchで記述された.NET Web APIがあります。 Elasticsearchには、「logging」というインデックスがあります。ここで、APIからログをプッシュします。

C#APIからElastic "logging"にログを取得する方法がわかりません。 ElasticSearchを使用したロギング... のようなドキュメントを読みましたが、Elasticsearchで利用可能なlogstashがありません。そこで、簡単にログを記録できるパッケージを探しています。どこにログインするかがわかるように、「ログ」インデックスを渡す必要があると思います。

誰かがそのためのドキュメントやパッケージを推奨できますか?

それとも自分でプログラムする必要がありますか?

7
Frank Mehlhop

Elasticsearch Common Schema(ECS)フィールド仕様に従って、Elasticsearchに直接.NET Coreログを書き込むスタンドアロンロガープロバイダーもあります https://github.com/sgryphon/essential-logging/tree /master/src/Essential.LoggerProvider.Elasticsearch

免責事項:私は著者です

Essential.LoggerProvider.Elasticsearchパッケージへの参照を追加します。

dotnet add package Essential.LoggerProvider.Elasticsearch

次に、提供された拡張メソッドを使用して、Hostの構築中にプロバイダーをloggingBuilderに追加します。

using Essential.LoggerProvider;

// ...

    .ConfigureLogging((hostContext, loggingBuilder) =>
    {
        loggingBuilder.AddElasticsearch();
    })

次に、ILoggerをコントローラーなどに挿入し、スコープとセマンティック値を含む通常の.NETロギングを使用してそれに書き込むことができます(ロギングの一般的な概要については https://docs.Microsoft.com/ en-us/aspnet/core/fundamentals/logging / ):

using (_logger.BeginScope("{CustomerId}", customerId))
{
  _logger.LogWarning("End of processing reached at {EndTime}.", end);
}

デフォルトの構成では、 http:// localhost:9200 / で実行されているローカルElasticsearchに書き込みます。

必要に応じてElasticsearchとKibanaのローカルインスタンスを設定するdocker-composeファイルを含むサンプルプロジェクトがあります https://github.com/sgryphon/essential-logging/tree/master/examples/HelloElasticsearch

サンプルプロジェクトは、Microsoft LoggerMessageヘルパーを使用した、高性能ロギングのベストプラクティスも示しています。

いくつかのログイベントを送信したら、Kibana(例 http:// localhost:5601 / )を開き、時間フィルター "@timestamp"を使用して "dotnet- *"のインデックスパターンを定義します(これはロガープロバイダーのデフォルトのインデックスパターン)。

注:質問に従って、index logging- *を使用するには、構成設定も変更して、appsettings.jsonファイルに以下を追加する必要があります。

{
  "Logging": {
    "Elasticsearch": {
      "Index": "logging-{0:yyyy.MM.dd}"
    }
  }
}

その後、インデックスのログイベントを検出できます。追加するいくつかの有用な列は、log.level、log.logger、event.code、メッセージ、タグ、およびprocess.thread.idです。

複数のアプリケーションまたは複数のサーバーで実行している場合は、service.type、service.version、およびHost.hostnameを含めることができます。

追加のフィールドを以下に定義します。個々のメッセージとスコープの値はすべてラベルとして記録されます。*カスタムキー/値のペア。 labels.CustomerId。

ElasticsearchLoggerProviderの1つの利点は、フィールドの Elasticsearch Common Schema(ECS) に準拠しているため、Elasticsearchにログを記録する他のアプリケーション(ビートなど)と互換性があることです。

出力例: 例-KibanaによるElasticsearch出力

0
Sly Gryphon

個人的には Filebeat を使用してさまざまなソースからログを収集し、それぞれにカスタムフィールド(app: "myappp1"など)を追加して、Elasticsearchに出力します。次に、これらのフィールドに基づいてKibanaでクエリを作成します。例:

filebeat.inputs:

- type: log
  enabled: true
  paths:
    - C:\ProgramData\Elastic\Elasticsearch\logs\*
  fields:
    app: "elasticsearch"

- type: log
  enabled: true
  paths:
    - C:\temp\log\myapp1\*
  fields:
app: "myapp1"

本当に複数のインデックスが必要な場合は、パターンまたはフィールド名を使用してインデックスを作成できる Logstash を使用することをお勧めします。 この質問 は、logstashを使用して複数のインデックスを作成することについて良い回答を持っています。

0
victortv