我在我的项目中使用Microsoft.Extensions.DependencyInjection,并希望将Microsoft.Extension.Logging与NLog用作实际的日志记录框架。
由于我希望能够以编程方式确定启动时的日志记录配置(以解决路径问题),所以我正在执行以下操作:
var config = new LoggingConfiguration();
var dirPath = Path.Combine(publicStorage, "Test");
var logFileTarget = new NLog.Targets.FileTarget()
{
CreateDirs = true,
FileName = Path.Combine(dirPath, "test.log"),
FileNameKind = NLog.Targets.FilePathKind.Absolute,
Layout = "${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}",
Name = "FileLog",
};
//Add Logging Targets
config.AddTarget(logFileTarget);
//Add Rules
config.AddRuleForAllLevels(logFileTarget, "*", false);
LogManager.Configuration = config;
但是,这不会配置ServiceProvider.GetService<ILogger<T>>
返回的那些Logger。
但是,如果我使用LogManager.GetLogger("TestLogger")
,则会按预期配置日志记录。
LogManager.ReconfigExistingLoggers();
也不能解决问题,我的搜索结果为空
编辑
DI设置如下:
return new ServiceCollection()
// Configure Logging Provider
.AddLogging(builder =>
{
builder.AddDebug();
//Add NLog
builder.AddNLog(new NLogProviderOptions()
{
CaptureMessageTemplates = true,
CaptureMessageProperties = true,
});
})
... // Registering additional dependencies
.BuildServiceProvider();
使用
LogManager.GetCurrentClassLogger
会产生与serviceProvider返回的Logger相同的“错误行为”。以来 该规则是使用"*"
设置的,我希望所有记录器(包括使用类名的记录器)都被该规则捕获
最后一句话是不正确的,它实际上可以正常工作,但是仍然存在通过di消息不出现ILogger的情况
答案 0 :(得分:1)
记住失踪者:
builder.SetMinimumLevel(LogLevel.Trace);