Serilog-Sinks-Loki将日志大量传输到Loki如何减少批次数量?

问题描述

我正在尝试将日志从.netcore 3.1 API发送到Loki服务器。为此,我使用了Serilog-Sinks-Loki块包。 当我运行代码时,日志将立即发送,并且可以在Grafana中看到它们。随着时间的流逝,原木的延迟越来越大。最终,我发现我的日志在延迟10分钟到达Loki之后到达了。 我了解了这一点,并了解到Serilog-Sinks-Loki位于Serilog-Sinks-Http的顶部,因此我需要在那儿进行配置以使日志更快到达,但不确定如何,有人可以帮我吗? 我的目标是立即发送日志,而不会延迟。

这是我的program.cs代码

public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
                .UseLamar()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureLogging(logging =>
                {

                    var credentials = new BasicAuthCredentials("LOKI-SERVER-URL","USER","PASSWORD");
                    var log = new LoggerConfiguration()
                            .MinimumLevel.Verbose()
                            .Enrich.FromLogContext()
                            .Writeto.LokiHttp(credentials)
                            .CreateLogger();
                    logging.AddSerilog(log);
                });
    }

解决方法

尽管Serilog.Sinks.Loki包装了一个Serilog.Sinks.Http接收器,it doesn't expose any of the settings可以让您配置发送邮件的频率(batchPostingLimit,period,etc.

也就是说,Sinks.Sink.Http的默认时间是2秒,因此10分钟对于使用默认设置发送的消息来说太长了。您可能遇到连接问题,阻止接收器发送消息或阻止服务器接收消息。

您是否尝试过启用SelfLog来查看接收器是否捕获到任何错误?

如果没有,您可以监视网络流量,以查看接收器尝试发送日志事件时是否可以找到失败的尝试和/或超时。

您还可以extend the LokiHttpClient并将一些调试消息写入文件或其他内容,以查看发送的频率/数量。

作为参考,这里是Serilog.Sinks.Loki存储库中的最新一期(也许是您创建的?)

Logs are been sent as a batch once in 10 minutes #26