アプリケーション トレース メッセージのログ記録に 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 プラグインですか?