3

我在 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"
  }
}

我在配置日志记录级别中只得到这个: 配置日志记录级别截图

我究竟做错了什么?

4

4 回答 4

2

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

让我知道它是否能解决您的问题。

于 2019-03-20T12:59:59.547 回答
1

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

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

Andrew Lock 写了一篇不错的帖子,其中详细介绍了 Serilog 如何将自己插入

于 2018-10-24T20:30:29.977 回答
1

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

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

在我的例子中,通过 Serilog Api 创建 Serilog 记录器并在 Serilog 旁边将 NLog 注册为 Log Provider 的代码如下所示:

// 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 时它可以工作)。

于 2020-06-08T09:21:53.327 回答
0

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

您为什么不以本文为例尝试快速 POC,(您只需添加 Steeltoe 和 PCF 平台的东西并尝试):

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

NLog的另一个问题与您在Steeltoe Github repo中的问题相关联,它给了我这个想法,我想值得一试)

我希望它有帮助!

于 2018-12-10T08:33:33.223 回答