如何将 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.DynamicLogger 是 Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider
的包装。正如今天存在的那样,它旨在与允许多个 ILoggerProvider 的 Microsoft 日志记录系统一起使用。
Serilog 将自身插入日志记录管道并且不允许其他 ILoggerProvider,因此将其添加到具有 Steeltoe Management 和 DynamicLogger 的应用程序将破坏 Steeltoe 在运行时更改日志级别的能力。
Andrew 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 时它可以工作)。
我在 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.DynamicLogger 是 Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider
的包装。正如今天存在的那样,它旨在与允许多个 ILoggerProvider 的 Microsoft 日志记录系统一起使用。
Serilog 将自身插入日志记录管道并且不允许其他 ILoggerProvider,因此将其添加到具有 Steeltoe Management 和 DynamicLogger 的应用程序将破坏 Steeltoe 在运行时更改日志级别的能力。
Andrew 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 时它可以工作)。