在 .NET Core 3 中使用 NLog 管理日志记录配置
Manage logging configuration with NLog in .NET Core 3
我在 .NET Core 3.1 辅助角色服务应用程序中使用 NLog。
按照 NLog 的教程,我插入了一个 nlog.config 文件来管理配置。
现在我很困惑,因为我有三点配置日志记录:
在我需要在依赖注入上下文中创建记录器的代码中
// Other code...
services.AddScoped<IApplyJcdsCommandsJob, ApplyJcdsCommandsJob>(provider =>
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.ClearProviders()
.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Trace)
.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Trace)
.AddFilter("ApplyJcdsCommandsJob", Microsoft.Extensions.Logging.LogLevel.Trace)
//.AddConsole()
//.AddEventLog();
.AddNLog(configuration);
});
Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<CommandsJob>();
return new CommandsJob(logger);
})
// Other code...
在appSettings.json
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Trace",
"Microsoft": "Trace"
}
}
}
在NLog.config
nuget 包安装生成的默认配置文件:
<!-- a section of the config -->
<targets>
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="f" />
</rules>
<!-- ... -->
我看到的是,如果删除 Nlog.config 文件,将不会创建日志文件。
其他更改接缝无效。
这些配置有什么关系?
切换 on/off 日志记录和设置级别的最佳方法是什么?
AddNLog
像任何其他 Microsoft Extension Logger (MEL) LoggingProvider 一样注册 NLog(类似于 AddConsole
)。
这意味着 NLog 仅获取 MEL-ILogger "approved" 的日志输出。因此,在 MEL 中配置的任何过滤都会阻止 logevents 到达 NLog。
NLog 仍然能够根据 Logger 名称和 LogLevel 严重性重定向到所需的 NLog 目标。
您可以决定是否要使用 MEL 过滤或 NLog 过滤,或两者的组合。但是,如果您只想使用 "pure" NLog,那么只需创建一个 NLog.Extensions.Logging.NLogLoggerFactory
的实例。它是一个专门的 ILoggerFactory,忽略了 MEL-Filtering-Configuration。
顺便说一句。为每个 CommandsJob 实例创建一个独立的 LoggerFactory 有点奇怪。会认为你会在依赖注入框架中注册类型,并让它注入构造函数参数。另请参阅此示例:
其中 LoggerFactory 是使用 AddLogging(...)
创建的,Runner
在 ServiceCollection 中注册以进行依赖注入。当创建 Runner
的实例时,依赖注入将自动提供 ILogger
作为构造函数参数。
决定使用 NLog 的人通常还希望禁用所有 MEL 过滤以避免混淆两个过滤系统。所以 NLog wiki-tutorial 是针对这些用户的。
我想首先是 MEL 用户的人可能只会使用 new HostBuilder().CreateDefaultBuilder().Build()
(将在启用所有枪支的情况下设置所有内容)。
但如果继续使用简单示例,则需要删除:
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
并添加:
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
所以看起来像这样:
serviceCollection.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
loggingBuilder.AddNLog(config);
})
ILoggingBuilder.AddConfiguration
可以在 Nuget 找到:Microsoft.Extensions.Logging.Configuration
我在 .NET Core 3.1 辅助角色服务应用程序中使用 NLog。 按照 NLog 的教程,我插入了一个 nlog.config 文件来管理配置。
现在我很困惑,因为我有三点配置日志记录:
在我需要在依赖注入上下文中创建记录器的代码中
// Other code... services.AddScoped<IApplyJcdsCommandsJob, ApplyJcdsCommandsJob>(provider => { var loggerFactory = LoggerFactory.Create(builder => { builder .ClearProviders() .AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Trace) .AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Trace) .AddFilter("ApplyJcdsCommandsJob", Microsoft.Extensions.Logging.LogLevel.Trace) //.AddConsole() //.AddEventLog(); .AddNLog(configuration); }); Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<CommandsJob>(); return new CommandsJob(logger); }) // Other code...
在appSettings.json
{ "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Trace", "System": "Trace", "Microsoft": "Trace" } } }
在NLog.config
nuget 包安装生成的默认配置文件:
<!-- a section of the config --> <targets> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="f" /> </rules> <!-- ... -->
我看到的是,如果删除 Nlog.config 文件,将不会创建日志文件。 其他更改接缝无效。
这些配置有什么关系? 切换 on/off 日志记录和设置级别的最佳方法是什么?
AddNLog
像任何其他 Microsoft Extension Logger (MEL) LoggingProvider 一样注册 NLog(类似于 AddConsole
)。
这意味着 NLog 仅获取 MEL-ILogger "approved" 的日志输出。因此,在 MEL 中配置的任何过滤都会阻止 logevents 到达 NLog。
NLog 仍然能够根据 Logger 名称和 LogLevel 严重性重定向到所需的 NLog 目标。
您可以决定是否要使用 MEL 过滤或 NLog 过滤,或两者的组合。但是,如果您只想使用 "pure" NLog,那么只需创建一个 NLog.Extensions.Logging.NLogLoggerFactory
的实例。它是一个专门的 ILoggerFactory,忽略了 MEL-Filtering-Configuration。
顺便说一句。为每个 CommandsJob 实例创建一个独立的 LoggerFactory 有点奇怪。会认为你会在依赖注入框架中注册类型,并让它注入构造函数参数。另请参阅此示例:
其中 LoggerFactory 是使用 AddLogging(...)
创建的,Runner
在 ServiceCollection 中注册以进行依赖注入。当创建 Runner
的实例时,依赖注入将自动提供 ILogger
作为构造函数参数。
决定使用 NLog 的人通常还希望禁用所有 MEL 过滤以避免混淆两个过滤系统。所以 NLog wiki-tutorial 是针对这些用户的。
我想首先是 MEL 用户的人可能只会使用 new HostBuilder().CreateDefaultBuilder().Build()
(将在启用所有枪支的情况下设置所有内容)。
但如果继续使用简单示例,则需要删除:
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
并添加:
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
所以看起来像这样:
serviceCollection.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.AddConfiguration(config.GetSection("Logging"));
loggingBuilder.AddNLog(config);
})
ILoggingBuilder.AddConfiguration
可以在 Nuget 找到:Microsoft.Extensions.Logging.Configuration