我有一个带有 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
我通过不在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>