Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net核心应用程序中的Log4Net:LoggingEvent未正确设置(LocationInformation属性设置为“?”)_C#_.net Core_Log4net - Fatal编程技术网

C# .Net核心应用程序中的Log4Net:LoggingEvent未正确设置(LocationInformation属性设置为“?”)

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">

到目前为止,我们一直在以.NET4.6.1为目标的项目中使用log4net,这很有魅力。几个月前,我们开始实施我们的第一个.NET核心项目。但是log4net似乎在这个框架中存在问题。我们已经编写了自己的appender,将所有日志事件推送到日志系统。然而,在核心项目中,
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
来提取位置信息。本质上,它是log4net
LocationInfo
类本身的代码,只需做一些调整。
{
  "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"
}