C# .Net核心应用程序中的Log4Net:LoggingEvent未正确设置(LocationInformation属性设置为“?”)
到目前为止,我们一直在以.NET4.6.1为目标的项目中使用log4net,这很有魅力。几个月前,我们开始实施我们的第一个.NET核心项目。但是log4net似乎在这个框架中存在问题。我们已经编写了自己的appender,将所有日志事件推送到日志系统。然而,在核心项目中,C# .Net核心应用程序中的Log4Net:LoggingEvent未正确设置(LocationInformation属性设置为“?”),c#,.net-core,log4net,C#,.net Core,Log4net,到目前为止,我们一直在以.NET4.6.1为目标的项目中使用log4net,这很有魅力。几个月前,我们开始实施我们的第一个.NET核心项目。但是log4net似乎在这个框架中存在问题。我们已经编写了自己的appender,将所有日志事件推送到日志系统。然而,在核心项目中,LoggingEvent对象中缺少基本信息 我已经建立了一个名为Log4NetUnitTest的最小测试项目来重复这种行为 csproj文件: <Project Sdk="Microsoft.NET.Sdk">
LoggingEvent
对象中缺少基本信息
我已经建立了一个名为Log4NetUnitTest
的最小测试项目来重复这种行为
csproj
文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="log4net" Version="2.0.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="MSTest.TestAdapter" Version="1.4.0" />
<PackageReference Include="MSTest.TestFramework" Version="1.4.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
</Project>
自定义appender(它只是将JSON格式的事件写入控制台):
运行测试时,您将获得以下输出:
{
"ApplicationName": "testhost",
"Method": "?",
"Line": "?",
"Class": "?",
"LoggerName": "Log4NetUnitTest.LoggingTests",
"MachineName": "NBG-ITSD-138",
"ExceptionMessage": "Some exception",
"Message": "Some error text",
"Level": "ERROR"
}
因此,无法解析方法
、行
和类
。另外一些其他属性(我们没有使用)如域
、标识
和用户名
只是设置为“不可用”。将TargetFramework
更改为net461
时,所有属性都设置正确:
{
"ApplicationName": "Log4NetUnitTest",
"Method": "Log",
"Line": "31",
"Class": "Log4NetUnitTest.LoggingTests",
"LoggerName": "Log4NetUnitTest.LoggingTests",
"MachineName": "NBG-ITSD-138",
"ExceptionMessage": "Some exception",
"Message": "Some error text",
"Level": "ERROR"
}
几年前,有人有一个类似的问题(不是NET core),通过添加loggingEvent.Fix=FixFlags.All
位于Append()
方法的开头。但对我来说不起作用:-(
我想我需要添加一些配置或附加包,但我不知道哪里出了问题。非常感谢您的任何建议。查看源代码,似乎很多功能都包含在\if!(NETCF | | NETSTANDARD1\u 3)中
block,这就是为什么在使用.NET Core时没有设置这些功能的原因。我想这项功能在.NET标准1.3中是不可用的
Apache JIRA中有一个问题,它提到.NET标准的更高版本添加了缺失的功能,如果将log4Net升级到更高的.NET标准版本,这些值可以恢复。对这个问题进行投票和评论可能会有所帮助。在哪里可以解决这个问题?@JPGarza嗯,不需要log4net包本身。在我们的appender中,我检查像
MethodName
或LineNumber
这样的字段是否设置正确。如果设置不正确,我自己解析StackTrace
来提取位置信息。本质上,它是log4netLocationInfo
类本身的代码,只需做一些调整。
{
"ApplicationName": "testhost",
"Method": "?",
"Line": "?",
"Class": "?",
"LoggerName": "Log4NetUnitTest.LoggingTests",
"MachineName": "NBG-ITSD-138",
"ExceptionMessage": "Some exception",
"Message": "Some error text",
"Level": "ERROR"
}
{
"ApplicationName": "Log4NetUnitTest",
"Method": "Log",
"Line": "31",
"Class": "Log4NetUnitTest.LoggingTests",
"LoggerName": "Log4NetUnitTest.LoggingTests",
"MachineName": "NBG-ITSD-138",
"ExceptionMessage": "Some exception",
"Message": "Some error text",
"Level": "ERROR"
}