Graylog 与 log4net Gelf Appender 和AdditionalFields 发送 NULL 值

问题描述 投票:0回答:1

我有一个带有 log4net Logger 的 Web 应用程序。现在我想将日志数据发送到 Graylog Logger Service。 使用附加字段将日志数据从 log4net 发送到 Graylog 无法以正确的方式工作。

我将GelfUdpAppender添加到应用程序中,并使用AdditionalFields在web.config中定义了这个新的appender:

<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net">
  <remoteAddress value="..." /> 
  <remotePort value="12201" />
  <layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net">
    <param name="AdditionalFields" value="Level:%level,RequestId:%property{RequestId},Thread:%thread" />
  </layout>
</appender>

在 Graylog 中显示日志条目。
'%level'、'%thread' 等值已正确转换 但“%property{RequestId}”未显示正确的值 - 只是“(null)”。

结果:

"Level": "WARN",
"RequestId": "(null)", <==
"Thread": "19",

在 log4net 中,相关的上下文属性设置如下:

log4net.ThreadContext.Properties["RequestId"] = "123456789";

在 DebugAppender 中显示相关值:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
  <layout type="CLX.Core.Web.Logging.LoggingPatternLayout, CLX.Core.Web">
    <param name="ConversionPattern" value="%date{HH:mm:ss} Level:%level,RequestId:%property{RequestId},Thread:%thread %n" />
  </layout>
</appender>

结果:

15:59:57 Level:WARN,RequestId:123456789,Thread:19

根据手册(https://github.com/jjchiw/gelf4net),AdditionalFields 属性支持转换模式 就像您使用 log4net 中的 PatternLayout 类一样。

配置有什么问题?

更新

在 GelfUdpAppender 内设置具有相同属性的 ConversionPattern:

<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net">
  <remoteAddress value="..." /> 
  <remotePort value="12201" />
  <layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net">
    <param name="AdditionalFields"  value="Level:%level,RequestId:%property{RequestId},Thread:%thread" />
    <param name="ConversionPattern" value="Level:%level,RequestId:%property{RequestId},Thread:%thread %n%m" />
  </layout>
</appender>

会产生相同的结果 - 它不仅与附加字段相关:

Level:WARN,RequestId:(null),Thread:19

c# logging log4net graylog gelf
1个回答
0
投票

我通过不在AdditionalFields & ConversionPattern 中使用“%property{RequestId}”解决了这个问题。 默认情况下,它会发送 log4net.*Context.Properties 列表中所有已定义的属性。

<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net">
  <remoteAddress value="..." /> 
  <remotePort value="12201" />
  <layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net">
    <param name="AdditionalFields"  value="Level:%level,Thread:%thread" />
    <param name="ConversionPattern" value="Level:%level,Thread:%thread %n%m" />
  </layout>
</appender>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.