C# と Serilog を使用した Elastic Search のカスタム プロパティ


こんにちは!

今日は、c# と Serilog を使用して Elasticsearch のカスタム プロパティを作成する方法を紹介します.

ログをelasticsearchに送信するためのserilog構成があります

public class SerilogConfiguration{

    public static void GetFileAndElasticSearchLogger(IConfigurationRoot configuration = null)
      {
          var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
          configuration ??= new ConfigurationBuilder()
              .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile(
                  $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
                  optional: true)
              .AddEnvironmentVariables()
              .Build();

          Log.Logger = new LoggerConfiguration()
              .Enrich.FromLogContext()
              .WriteTo.Debug()
              .WriteTo.Console(
                outputTemplate: "Level:{Level:u4} Tenant:{TenantId} Time:{Timestamp:HH:mm:ss} Message:{Message:lj}{NewLine}{Exception}"
              )
              .WriteTo.Elasticsearch(ConfigureElasticSink(configuration["App:Id"], configuration, environment))
              .Enrich.WithProperty("Environment", environment)
              .ReadFrom.Configuration(configuration)
              .CreateLogger();
      }

      private static ElasticsearchSinkOptions ConfigureElasticSink(string applicationName, IConfigurationRoot configuration, string environment)
      {
          var env = environment?.ToLower().Replace(".", "-");
          if (configuration["ElasticSearch:Password"] != null)
          {
              return new ElasticsearchSinkOptions(new Uri(configuration["ElasticSearch:Uri"]))
              {

                  ModifyConnectionSettings = x => x.BasicAuthentication(
                      configuration["ElasticSearch:User"],
                      configuration["ElasticSearch:Password"]
                  ) ,
                  AutoRegisterTemplate = true,
                  IndexFormat = $"DEV-TO-EXAMPLE-{applicationName}{(env != null? "-"+env : "")}"
              };
          }
          return new ElasticsearchSinkOptions(new Uri(configuration["ElasticSearch:Uri"]))
          {
              AutoRegisterTemplate = true,
              IndexFormat = $"DEV-TO-EXAMPLE-{applicationName}{(env != null? "-"+env : "")}"
          };

      }
    }



次に、startup.cs で構成を読み込む必要があります.

public static int Main(string[] args){        { 
SerilogConfiguration.GetFileAndElasticSearchLogger();
...
}


ここで、ロガー メソッドを呼び出す必要があります

var Logger = Serilog.Log.Logger;
Logger
.ForContext("LogName", "Dev.To Example")
.ForContext(ExecutionTime, 1500)
.Information("Created Log....")


このメソッドがelasticsearchにログを登録する場合、elastic searchはこれらのプロパティを「フィールド」に添付します

これで、de KQL を使用してログを検索できます

fields.LogName: "%.TO%"
//or 
fields.ExecutionTime > 1500