ASP.NET Core ILogger 不会记录到 Trace,除非附加了调试器
ASP.NET Core ILogger does not log to Trace unless a debugger is attached
我有一个奇怪的情况,我无法从 ASP.NET 核心 ILogger<T>
接收任何跟踪,除非附加了调试器(即使我在调试配置中 运行)。先解释一下:
我需要按日期将日志写入文件,我之前为此编写了一个简单的自定义 TraceListener,因此我认为我可以在不编写新的日志提供程序的情况下重用它:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddTraceSource("IISLogCleaner");
// I added below line to make sure I am not missing anything
logging.SetMinimumLevel(LogLevel.Trace);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在Startup.ConfigureServices()
中,我添加监听器:
var listener = new DailyTraceListener(folder);
Trace.Listeners.Add(listener);
现在记录后台任务:
ILogger<CleanupTask> logger;
public CleanupTask(ILogger<CleanupTask> logger)
{
this.logger = logger;
}
// ...
async Task<int> WorkAsync(CancellationToken token)
{
System.Diagnostics.Debug.WriteLine("Start Working");
this.logger.LogInformation("Start working");
await Task.Delay(1000);
this.logger.LogInformation("Work finished");
return await Task.FromResult(10000);
}
问题是:附加调试器后,所有日志都写入日志文件。但是,当我选择 运行 而不调试时,即使在调试配置中,也不会创建任何文件,也不会写入任何内容,直到我添加了 Debug.WriteLine
调用,现在只有这些行被记录,但所有logger.LogInformation()
未记录。
输出 window 但是,收到所有消息:
为了安全起见,我删除了appsettings.Development.json
文件,只剩下appsettings.json
。这是日志内容:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
多年以后,我知道,但我相信你正在打这个:
ASP.Net Core Logging and DebugView.exe
我今天花了 3 个小时在这个上,感觉你的油漆
TL;DR:Debugger.IsAttached
在 Microsoft.Extensions.Logging.Debug 内检查。
我有一个奇怪的情况,我无法从 ASP.NET 核心 ILogger<T>
接收任何跟踪,除非附加了调试器(即使我在调试配置中 运行)。先解释一下:
我需要按日期将日志写入文件,我之前为此编写了一个简单的自定义 TraceListener,因此我认为我可以在不编写新的日志提供程序的情况下重用它:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddTraceSource("IISLogCleaner");
// I added below line to make sure I am not missing anything
logging.SetMinimumLevel(LogLevel.Trace);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在Startup.ConfigureServices()
中,我添加监听器:
var listener = new DailyTraceListener(folder);
Trace.Listeners.Add(listener);
现在记录后台任务:
ILogger<CleanupTask> logger;
public CleanupTask(ILogger<CleanupTask> logger)
{
this.logger = logger;
}
// ...
async Task<int> WorkAsync(CancellationToken token)
{
System.Diagnostics.Debug.WriteLine("Start Working");
this.logger.LogInformation("Start working");
await Task.Delay(1000);
this.logger.LogInformation("Work finished");
return await Task.FromResult(10000);
}
问题是:附加调试器后,所有日志都写入日志文件。但是,当我选择 运行 而不调试时,即使在调试配置中,也不会创建任何文件,也不会写入任何内容,直到我添加了 Debug.WriteLine
调用,现在只有这些行被记录,但所有logger.LogInformation()
未记录。
输出 window 但是,收到所有消息:
为了安全起见,我删除了appsettings.Development.json
文件,只剩下appsettings.json
。这是日志内容:
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
多年以后,我知道,但我相信你正在打这个:
ASP.Net Core Logging and DebugView.exe
我今天花了 3 个小时在这个上,感觉你的油漆
TL;DR:Debugger.IsAttached
在 Microsoft.Extensions.Logging.Debug 内检查。