log4net 写 '?' 当我使用 `%type、%method 和 %line` 模式时

Dza*_*zak 3 asp.net log4net

我正在尝试在我的 c# ASP.net Core 2.2 应用程序中使用 log4net,但是当我使用这些模式中的任何一个时,它们都会给我带问号的输出。

我的 log4net.config:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Temp\app.log" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%date | %level | [%thread] | %type %method %line - %message%n" />
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingFile" />
  </root>
</log4net>
Run Code Online (Sandbox Code Playgroud)

写入日志后文件如下所示:

2019-04-17 11:48:44,230 | INFO | [1] | ? ? ? - abc
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生这种情况以及如何解决这个问题吗?我看到了一些使用这些模式的教程,并试图从中复制,但结果是一样的......也许我的配置有问题?

这里我知道我可以将文件名和行添加到我的消息中,但我想先在配置文件中尝试修复。

谢谢。

Pes*_*ska 5

我将您的配置复制粘贴到我的项目中,它按预期工作。你是在 Release 还是 Debug 中运行你的项目?你读过这些模式的限制吗?

注意呼叫者位置信息。以下模式%type %file %line %method %location %class %C %F %L %l %M都生成调用者位置信息。位置信息使用 System.Diagnostics.StackTrace该类生成调用堆栈。然后从这个堆栈中提取调用者的信息。

System.Diagnostics.StackTrace是类不支持.NET Compact Framework的1.0,因此呼叫者位置信息不可用该框架为基础。

System.Diagnostics.StackTrace课程对发布版本有以下说法:

StackTrace 信息对调试构建配置最为有用。默认情况下,调试版本包含调试符号,而发布版本不包含。调试符号包含用于构造 StackFrame 和 StackTrace 对象的大部分文件、方法名称、行号和列信息。由于优化期间发生的代码转换,StackTrace 可能不会报告预期的那么多方法调用。

这意味着在发布版本中,调用者信息可能 不完整或根本不存在!因此,在发布版本中不能依赖调用者位置信息。

编辑

在 .net core / .net 标准 StackTrace 中不完全支持:

https://github.com/apache/logging-log4net/blob/master/src/Core/LocationInfo.cs#L86

所以className, fileName, lineNumber, methodName,fullInfo不可用。