【发布时间】:2021-09-09 14:56:28
【问题描述】:
我正在尝试将 NLog 添加到 .NET 5 控制台应用程序。
我知道我不想对其中一些设置进行硬编码,并很快链接一个 appsettings 文件,但我只想让所有内容都先记录下来,而且最少。
到目前为止我有:
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var config = new LoggingConfiguration();
var fileTarget = new FileTarget("fileTarget")
{
FileName = @"c:\AppLogs\TestApp\mylog-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
};
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development")
{
fileTarget = new FileTarget("fileTarget")
{
FileName = @"c:\AppLogs\TestApp_UAT\mylog-${shortdate}.log",
Layout = "${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
};
}
config.AddTarget(fileTarget);
// rules
config.AddRuleForOneLevel(NLog.LogLevel.Warn, fileTarget);
config.AddRuleForOneLevel(NLog.LogLevel.Error, fileTarget);
config.AddRuleForOneLevel(NLog.LogLevel.Fatal, fileTarget);
LogManager.Configuration = config;
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddTransient<TestService>();
}).ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
logging.AddNLog();
}).Build();
var svc = ActivatorUtilities.CreateInstance<TestService>(host.Services);
svc.Run();
}
然后我尝试在 TestService 中记录一些内容:
public class TestService
{
public TestService(ILogger<TestService> logger)
{
Logger = logger;
}
public ILogger<TestService> Logger { get; }
public void Run()
{
Console.WriteLine("my first log");
Logger.LogInformation("my first log");
}
}
我没有收到任何错误,但我也没有创建任何日志(文件或内容)。控制台输出,所以TestServices运行正常。
根据文档,我希望在“ConfigureLogging()”之后看到一个名为“BuildServiceProvider()”的方法,但我只有“Build()”。这是与它有关还是有我错过了什么?
【问题讨论】:
-
您正在使用
LogInformation,但您仅使用AddRuleForOneLevel启用了Warn+Error+Fatal。也许用AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, fileTarget)代替?