我正在尝试在我的 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)
知道为什么会发生这种情况以及如何解决这个问题吗?我看到了一些使用这些模式的教程,并试图从中复制,但结果是一样的......也许我的配置有问题?
从这里我知道我可以将文件名和行添加到我的消息中,但我想先在配置文件中尝试修复。
谢谢。
我将您的配置复制粘贴到我的项目中,它按预期工作。你是在 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不可用。
| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |