【问题标题】:How to set Steeltoe Dynamic Logging works with 3rd party loggers as Serilog?如何将 Steeltoe 动态日志设置为 Serilog 与 3rd 方记录器一起使用?
【发布时间】:2020-06-08 17:21:53
【问题描述】:

我在 Pivotal Cloud Foundry 中有 ASP.NET Core 2.1 应用程序,我们希望能够在其中动态配置日志记录级别。作为记录器提供者,我们使用 Serilog。 Steeltoe Dynamic Logging 是否可以与 3rd 方记录器一起正常工作以及如何工作?

这是我尝试过的:

在 Program.cs 中:

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseCloudFoundryHosting()
            .ConfigureLogging((builderContext, loggingBuilder) =>
             {
                 loggingBuilder.AddDynamicConsole();
             })
            .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                        .ReadFrom.Configuration(hostingContext.Configuration))
            .UseStartup<Startup>();

在 appsettings.json 中

"Serilog": {
"WriteTo": [
  {
    "Name": "Console",
    "Args": {
      "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext}: {Properties} {NewLine} {EventId} {Message:lj}{NewLine}{Exception}"
    }
  }
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]

}

在 appsettings.Development.json 中:

 "Logging": {
"LogLevel": {
  "Default": "Debug"
  }
}

我在配置日志记录级别中只得到这个: Configure logging levels screenshot

我做错了什么?

【问题讨论】:

    标签: asp.net-core-2.1 cloud-foundry serilog steeltoe


    【解决方案1】:

    我在这里添加了对 Steeltoe 的 serilog 支持:https://github.com/SteeltoeOSS/Logging/pull/4

    如果它解决了您的问题,请告诉我。

    【讨论】:

      【解决方案2】:

      Steeltoe.Extensions.Logging.DynamicLogger 是Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider 的包装器。与今天一样,它旨在与允许多个 ILoggerProviders 的 Microsoft 日志记录系统一起使用。

      Serilog 将自己插入到日志管道中,并且不允许其他 ILoggerProviders,因此将其添加到具有 Steeltoe 管理和 DynamicLogger 的应用程序将破坏 Steeltoe 在运行时更改日志级别的能力。

      Andrew Lock 用details on how Serilog plugs itself in 写了一篇不错的帖子。

      【讨论】:

      • 谢谢你的回答,蒂姆
      • 我们没有积极的计划来处理这种类型的兼容性,但我确实在管理回购中添加了一个问题来跟踪这个项目 (github.com/SteeltoeOSS/Management/issues/21) 如果您想进一步讨论,请关注在那里取得进展或提出建议
      • Tim,是否有其他第三方日志提供程序可以与 Steeltoe 动态日志一起正常工作?我们同时需要语义日志记录和steeltoe 动态级别。
      • 可能不会,但我认为我们并没有在这方面花费大量时间。如果您看过其他工具,我可以考虑一下如何让 Steeltoe 与它们一起工作
      【解决方案3】:

      我现在已经为同一个问题工作了几个小时:注册 Serilog 以及其他日志提供程序(在我的例子中是 Nlog)。

      除了 Serilog 的默认行为(替换所有其他日志提供程序)之外,Serilog 还提供了一种通过其 Api 注册其他 LogProviders 的方法。

      在我的例子中,通过 Serilog Api 创建 Serilog 记录器并在 Serilog 旁边将 NLog 注册为日志提供程序的代码如下所示:

      // Configure nlog.
      NLogBuilder.ConfigureNLog("nlog.config");
      
      // Create an ILoggerProvider instance (needed to pass it to Serilog Api).
      var nlogLoggerProvider = new NLogLoggerProvider();
      
      // Create LoggerProviderCollection because this data type has to be passed to Serilog Api-Call.
      var loggerProviderCollection = new LoggerProviderCollection();
      loggerProviderCollection.Add(nlogLoggerProvider);
      
      // Create Serilog Logger and call WriteTo.Providers() in order to register other Log Providers.
      var logger = new LoggerConfiguration()
          .ReadFrom.Configuration(configuration)
          .MinimumLevel.Debug()
          .Enrich.FromLogContext()
      
          // This way you can register other LogProviders beside Serilog.
          .WriteTo.Providers(loggerProviderCollection)
      
          .CreateLogger();
      

      在使用 Serilog 时,您需要注册其他 Log Provider 的是您的 Log Provider 的一个对象,该对象实现了ILoggerProvider 接口。 您可以将实现 ILoggerProvider 的对象集合传递给您的 Serilog Logger,它们应该可以工作(至少在我混合使用 NLog 和 Serilog 时它可以工作)。

      【讨论】:

        【解决方案4】:

        我想您可以尝试使用 LoggerFactory 而不是 LoggingProvider 以便并行拥有多个可用的 Logging 提供程序,这样 Steeltoe 仍然可以包装 ConsoleLoggerProvider 而您的 Serilog 继续按预期工作......

        你为什么不以这篇文章为例尝试一个快速的 POC,(你只需要添加 Steeltoe 和 PCF 平台的东西并尝试):

        https://www.codeproject.com/Articles/1217036/Console-Logging-and-Reading-Excel-Files-with-NET-C

        (This other issue with NLog 链接到您在 Steeltoe Github 存储库中的问题,它给了我这个想法,我想值得一试)

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-31
          • 2020-03-13
          • 2016-01-25
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多