【问题标题】:Serilog not getting application events, only coded logger eventsSerilog 未获取应用程序事件,仅编码记录器事件
【发布时间】:2017-11-28 20:35:10
【问题描述】:

我将我的应用程序设置为使用 Serilog 作为日志记录机制。事实上,我确实得到了日志文件,并且可以在 Seq 上查看它们。最初我正在记录应用程序事件,但由于某种原因我不再得到它们。请参阅下面的图片。

在第一张图片中,我收到了应用程序事件。后来,当做同样的测试操作时,我不再得到应用程序事件,只有文件中的编码事件(即_logger.LogWarning("Warning");

我在 Main 方法中设置了 Serilog。

public static int Main(string[] args)
{
    var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    //Configure logger
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    Log.Information("Logger created");

    try
    {
        Log.Information("Starting web host");
        BuildWebHost(args).Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Web Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

我的 Serilog 设置

 "Serilog": {
  "Using": [
    "Serilog.Sinks.RollingFile",
    "Serilog.Sinks.Async",
    "Serilog.Sinks.ApplicationInsights",
    "Serilog.Sinks.Console",
    "Serilog.Sinks.Seq"
  ],
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Async",
      "Args": {
        "configure": [
          {
            "Name": "RollingFile",
            "Args": { "pathFormat": "C:/Logs/Serilog/log-{Date}.log" }
          },
          {
            "Name": "Seq",
            "Args": { "serverUrl": "http://localhost:5341" }
          }
        ]
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
  "Properties": {
    "Application": "WebTemplate"
  }
}

在继续让 Serilog 更实用之前,我想弄清楚为什么我不再收到应用程序事件。

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0 serilog seq-logging


    【解决方案1】:

    我希望这取决于您的 Serilog 设置中的以下部分:

    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Warning"
        }
    }
    

    Nicholas Blumhardt 的 blog post 详细介绍了 Override 设置的工作原理:

    那么,上述配置的效果是,当记录器由 Microsoft.* 命名空间中的类型拥有时,仅在警告级别或以上生成事件。

    这句话似乎直接适用于您的情况,即您要求 Serilog 过滤掉任何属于 Microsoft 的事件。* 命名空间 并且 的严重性低于 Warning

    您在第一个屏幕截图中显示的消息来自 MVC 或实体框架,它们位于 Microsoft.* 命名空间中,并且记录的严重性低于警告。

    【讨论】:

      【解决方案2】:

      您似乎在BuildWebHost() 中缺少UseSerilog()

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .UseSerilog() // <- Add this line
              .UseStartup<Startup>()
              .Build();
      

      这假设您已安装 Serilog.AspNetCore NuGet 包。

      【讨论】:

      • ....如果我在 ConfigureServices 中有这个,我需要吗?...services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true));因为我得到的是记录器事件而不是应用程序事件
      • 是的,你应该添加UseSerilog()并删除对services.AddLogging()的调用
      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2011-10-09
      • 2014-07-17
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多