如何将 Steeltoe Dynamic Logging 与第 3 方记录器一起设置为 Serilog?

How to set Steeltoe Dynamic Logging works with 3rd party loggers as Serilog?

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

这是我尝试过的:

在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

我做错了什么?

Steeltoe.Extensions.Logging.DynamicLoggerMicrosoft.Extensions.Logging.Console.ConsoleLoggerProvider 的包装。正如今天存在的那样,它旨在与允许多个 ILoggerProvider 的 Microsoft 日志记录系统一起使用。

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

A​​ndrew Lock 写了一个很好的 post 和一些 details on how Serilog plugs itself in

我想您可以尝试使用 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 存储库中的问题,它给了我灵感,我想值得一试)

希望对您有所帮助!

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

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

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

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

注册其他日志提供程序的方法

创建 Serilog 记录器并通过 Serilog 在 Serilog 旁边将 NLog 注册为日志提供程序的代码 Api 在我的例子中看起来像这样:

// 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 记录器,它们应该可以工作(至少当我混合使用 NLog 和 Serilog 时它可以工作)。