为什么我的带有 Log4Net 和 Extensions.Logging 的 .Net 7 控制台应用程序没有输出 LogDebug(),即使 Level 设置为 DEBUG

Why is my .Net 7 Console App with Log4Net and Extensions.Logging not outputting on LogDebug() even with Level set to DEBUG

提问人:Jayden 提问时间:7/17/2023 更新时间:7/17/2023 访问量:369

问:

我似乎无法在 .Net 7 控制台应用程序中使用 Log4Net 和 Microsoft.Extensions.Logging.Log4Net.AspNetCore 进行编写。我确信我正在将文件中的“level”元素正确设置为“DEBUG”。我可以将级别更改为“WARN”,这会按预期省略信息消息。如果更改为“DEBUG”或“ALL”,则不会将调试消息写出到控制台或文件。ILogger.LogDebug()log4net.config

问题与此处描述的类似:即使调试级别设置为 true,也不会显示 log4net 调试日志,但我没有覆盖任何其他配置文件中的设置(通过 Log4Net 调试的输出确认)。

使用的扩展和版本

Log4Net : 2.0.15
Microsoft.Extensions.Logging: 7.0.0
Micorosft.Extensions.Logging.Console : 7.0.0
Microsoft.Extensions.Logging.Log4Net.AspNetCore : 6.1.0

设置program.cs

var builder = Host.CreateApplicationBuilder();
...
builder.Logging.ClearProviders();
var loggingOptions = new Log4NetProviderOptions()
{
    Watch = false,
    Log4NetConfigFileName = Path.Combine(AppContext.BaseDirectory, "log4net.config")
};
builder.Logging.AddLog4Net(loggingOptions);

Log4Net 配置代码段

  <root>
    <level value = "DEBUG" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>

在注入了 ILogger 的类中:

_logger.LogCritical("Critial message");
_logger.LogDebug("Debug message");
_logger.LogError("Error message");
_logger.LogInformation("Information message");
_logger.LogTrace("Trace message");
_logger.LogWarning("Warning message");

输出

2023-07-17 08:04:22,325 [1] FATAL myapp.console.Verbs.TestVerb - Critical message
2023-07-17 08:04:22,381 [1] ERROR myapp.console.Verbs.TestVerb - Error message
2023-07-17 08:04:22,383 [1] INFO myapp.console.Verbs.TestVerb - Information message
2023-07-17 08:04:22,399 [1] WARN myapp.console.Verbs.TestVerb - Warning message

Log4Net 调试代码段

log4net: log4net assembly [log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a].
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=6.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=6.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] Loaded From [C:\git\myapp\myapp.console\bin\Debug\net7.0\win-x64\Microsoft.Extensions.Logging.Log4Net.AspNetCore.dll]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=6.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] does not have a RepositoryAttribute specified.
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=6.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
...
log4net: Logger [root] Level string is [DEBUG].
log4net: Logger [root] level set to [name="DEBUG",value=30000].
...
log4net: Opening file for writing [C:\ProgramData\myapp\log.txt] append [True]
log4net: Created Appender [file]
log4net: Adding appender named [file] to logger [root].

我可以通过更改为 WARN 来更改日志级别,例如:

  <root>
    <level value = "WARN" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>

现在按预期省略了“信息”级别。

2023-07-17 08:18:43,480 [1] FATAL myapp.console.Verbs.TestVerb - Critial message
2023-07-17 08:18:43,522 [1] ERROR myapp.console.Verbs.TestVerb - Error message
2023-07-17 08:18:43,525 [1] WARN myapp.console.Verbs.TestVerb - Warning message
.net-core log4net microsoft.extensions.logging

评论


答:

0赞 Jayden 7/17/2023 #1

事实证明,通过添加:

builder.Logging.SetMinimumLevel(LogLevel.Debug);

紧挨着这条线解决了问题。builder.Logging.AddLog4Net(loggingOptions)

我从 log4net 的 https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore/issues/70 链接中得到了这个线索,即使调试级别设置为 true,也不会显示调试日志,这给了我更多配置可以尝试。