【问题标题】:Serilog slow, bad performanceSerilog 速度慢,性能差
【发布时间】:2021-03-09 15:39:05
【问题描述】:

是我做错了什么还是 Serilog 的性能很差?

新建一个 Asp.Net Core 5.0 webapi 项目,添加对 Serilog.AspNetCore nuget 包的引用和如下配置代码。 Serilogs 每个请求增加 15 毫秒!在我的发布版本中,我的处理时间从 5 毫秒跳到了 20 毫秒。

程序.cs

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .CreateLogger();

        CreateHostBuilder(args).Build().Run();
    }

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

【问题讨论】:

  • 我同意接受的答案,但想补充一点,您的基准测试存在缺陷。 Web 服务器在内存中运行所有内容、不连接到数据库并且不发送任何 HTTP 请求的基准测试的值接近于零。这甚至不是一个比较。这就像什么都没有比较。
  • 您有没有想过 op 发布的场景小到可以放入 stackoverflow 页面?现实世界的场景太大了,读者无法尝试复制自己。

标签: asp.net-core serilog


【解决方案1】:

性能受到影响的可能不是 Serilog 本身,而是 您将所有日志同步写入控制台这一事实,这会阻塞请求线程并对性能产生一些影响。

如果您使用的任何其他日志库最终调用Console.WriteLine,我希望您获得类似的性能。结果。

一种常见的模式是使用Async sink,并在后台线程上写入控制台。例如:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Async(writeTo => writeTo.Console()) // <<#<<#<<
    .CreateLogger();

当然,从 Web 应用程序直接写入控制台通常不是最好的方法...There are much better Sinks you can use 直接定位到您将存储日志的位置。

【讨论】:

  • 为什么写入控制台这么慢?
  • @JasonCheng 因为写入控制台应该是一个顺序阻塞调用,即使在更高版本的 .net 核心 weblog.west-wind.com/posts/2018/Dec/31/…987654323@ 中有改进
  • 添加该单曲使事情变得像禁用日志记录一样快 ?。
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多