0

アプリケーション トレース メッセージのログ記録に Serilog を使用する .NET WebAPI サービス (C#) があります。1 つの Serilog シンクである TCPSink のみを使用してメッセージを Fluentd サイドカー コンテナーに送り出すため、WebAPI アプリケーション コードを変更することなく、ログの宛先を簡単に変更できます。これは、Elasticsearch や Humio などのターゲットでうまく機能しています。新しい Fluentd サイドカー コンテナーで Grafana Loki をサポートしたいと考えています。

デフォルトのフォーマット (JsonFormatter) で TCPSink を使用すると、Elasticsearch/Humio (logstash?) のフォーマットを簡単にサポートできます。しかし、ロキのフォーマットは大きく異なります。Fluentd のメッセージを本質的に生の JSON からストリーム形式にフォーマットする方法はありますか? それとも、「LokiFormatter」を作成して、GrafanaLoki シンクと同様に TCPSink で使用する必要がありますか?

C# でのテスト コードを次に示します。TCPSink シンクを使用したいと考えています。コメントアウトされた「GrafanaLoki」シンクが機能することに注意してください。

 private static void Main()
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))
                .AddYamlFile(CONFIGURATION_FILE_NAME, optional: false)
                .Build();            
           
            try
            {
                loggingLevel.MinimumLevel = LogEventLevel.Information;

                var lc = new LoggerConfiguration();

                lc.MinimumLevel.ControlledBy(loggingLevel);
                lc.MinimumLevel.Override("Microsoft", LogEventLevel.Warning);
                lc.MinimumLevel.Override("System", LogEventLevel.Error);

                Serilog.Debugging.SelfLog.Enable(msg => System.Console.WriteLine(msg));

                lc.WriteTo.Console();
                lc.WriteTo.TCPSink("tcp://localhost:9880");

                //var credentials = new LokiCredentials() { Login = "**username**", Password = "**password** };
                //lc.WriteTo.GrafanaLoki("https://logs-prod-us-central1.grafana.net", credentials: credentials);

                lc.Enrich.FromLogContext();
                lc.Enrich.WithProperty("applicationName", APPLICATION_NAME);
                lc.Enrich.WithProperty("environment", "dev");

                Log.Logger = lc.CreateLogger();

                int bob = 111;
                Log.Information("This is a test {bob}", bob);

                var msg = "Danger! Danger! Will Robinson!";
                Log.Warning("This is a warning : {msg}", msg);
            }
            catch (Exception ex)
            {
                Log.Error(ex, $"Error in {APPLICATION_NAME}");
            }
            finally
            {
                while (true)
                {
                    Thread.Sleep(1000);
                }
            }
        }

これは、提案された Loki サイドカー コンテナーの Dockerfile です。

FROM fluent/fluentd:v1.14.0-1.0
# FROM __DockerBaseImage__
USER root
RUN fluent-gem install fluent-plugin-grafana-loki
COPY fluentd.conf /fluentd/etc/fluent.conf
USER fluent

設定あり

<source>
  @type tcp
  <parse>
    @type json
  </parse>
  port 9880
  bind 0.0.0.0
  tag xxxx
</source>
<match xxxx>
  @type loki
  url                 https://logs-prod-us-central1.grafana.net
  username            **username**
  password            **password**
  extra_labels        {"env":"dev","farm":"a"} 
  flush_interval      5s
  flush_at_shutdown   true
  buffer_chunk_limit  1m
</match>

Fluentd にパーサー/フィルターを追加して、着信 TCP JSON を Loki 用にフォーマットする方法はありますか? または、「fluent-plugin-grafana-loki」の代わりに正しい fluentd プラグインですか?

4

0 に答える 0