有点晚了,但最近遇到了这个问题,原来在.NET Standard框架下不支持一些模式。
根据Apache的
文档,以下功能不受支持:
- ADO.NET附加程序
- 与ASP.NET相关的任何内容(跟踪附加程序和几个模式转换器)
- .NET Remoting
- 彩色控制台附加程序
- 事件日志附加程序
- NetSendAppender
- SMTP附加程序
- DOMConfigurator
- 堆栈跟踪模式
- 访问appSettings(既不能访问log4net部分本身,也不能使用AppSettingsPatternConverter)
- 使用EnvironmentFolderPathPatternConverter访问“特殊路径”
- 模拟Windows帐户
有两种解决方法:
- 使用 C# 5.0 的 Caller Info 属性 和自定义日志包装器,这里有一些很好的例子:
- 创建自定义
PatternConverter
,其中包含 StackTrace
(需要 .NET Standard 2.0 及更高版本),如下所示:
StackTraceConverter.cs
namespace MyWebApp
{
public class StackTraceConverter : PatternConverter
{
protected override void Convert(TextWriter writer, object state)
{
try
{
StackTrace st = new StackTrace(true);
int idx = 1;
while (st.GetFrame(idx).GetMethod().DeclaringType.Assembly == typeof(LogManager).Assembly)
idx++;
var targetSt = new StackTrace(st.GetFrame(idx));
writer.Write($"{targetSt.GetFrame(0).GetMethod().DeclaringType.FullName}.{targetSt.GetFrame(0).GetMethod().Name}({targetSt.GetFrame(0).GetFileLineNumber()})");
}
catch (Exception)
{
}
}
}
}
StackTracePatternLayout.cs
namespace MyWebApp
{
public class StackTracePatternLayout : PatternLayout
{
public StackTracePatternLayout()
{
AddConverter(new ConverterInfo
{
Name = "stack_trace",
Type = typeof(StackTraceConverter)
}
);
}
}
}
和log4net.config
<appender name="RollingFileAppenderCustomPattern" type="log4net.Appender.RollingFileAppender">
...
<layout type="MyWebApp.StackTracePatternLayout, MyWebApp">
<conversionPattern value="%-5p %date{yyyy/MM/dd HH:mm:ss} [tread-%t] %stack_trace - %m%n" />
</layout>
...
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppenderCustomPattern" />
</root>
然后像往常一样登录。
public class HomeController : Controller
{
...
public IActionResult LogForNetTest()
{
if (Logger.IsDebugEnabled)
Logger.Debug($"Log4Net is ready to log!");
...
}
...
}
结果类似于这样。
DEBUG 2018/07/02 15:30:59 [tread-9] MyWebApp.Controllers.HomeController.LogForNetTest(46) - Log4Net is ready to log!
尚未完全测试,但两种方法目前都能很好地工作,尽管它们之间存在一些差异:
希望这会有所帮助。
Timmy。