将自定义属性绑定到 Log4Net 中的 LoggingEvent 对象

Bind Custom Properties to LoggingEvent Object in Log4Net

我正在使用 log4net 并且我正在尝试找出最好的方法,或者如果有的话,将自定义字段绑定到 LoggingEvent 对象,该对象在 Append 覆盖 AppenderSkeleton 的方法。

例如,这可以是 guid 属性 添加到其他属性,例如 levelrenderedMessage

但是,我计划将 Log4net.Appenders.Fluentdlog4net.Ext.Json 一起使用,因此 xml 中的 appender 看起来像这样:

<appender name="Fluentd" type="Log4net.Appenders.Fluentd.FluentdAppender, Log4net.Appenders.Fluentd">
    <Host>127.0.0.1</Host>
    <Port>24224</Port>
    <Tag>YourTagHere</Tag>
    <NoDelay>false</NoDelay>
    <ReceiveBufferSize>8192</ReceiveBufferSize>
    <SendBufferSize>8192</SendBufferSize>
    <SendTimeout>1000</SendTimeout>
    <ReceiveTimeout>1000</ReceiveTimeout>
    <LingerEnabled>true</LingerEnabled>
    <LingerTime>1000</LingerTime>
    <EmitStackTraceWhenAvailable>true</EmitStackTraceWhenAvailable>
    <IncludeAllProperties>false</IncludeAllProperties>
    
  <!--json formatted log4net logging-->
  <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
    <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
    <member value="date:date" />
    <member value="level:level" />
    <member value="message:messageObject" />
  </layout> 
</appender>

我希望最后能有这样的东西:

<!--json formatted log4net logging-->
<layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
    <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
    <member value="date:date" />
    <member value="level:level" />
    <member value="message:messageObject" />
    <member value="guid:guid" />
</layout>

这是我必须要如何在 Log4net.Appenders.Fluentd 源代码中执行的东西吗?

您可以使用 ThreadContext 将自定义 属性 添加到传递给 AppenderSkeletonAppend 覆盖方法的 LoggingEvent 对象以及 LayoutSkeleton.

Format 覆盖方法

设置它:

ThreadContext.Properties["my_custom_prop"] = "my custom property"

然后取回:

var prop = evt.GetProperties()["my_custom_prop"].ToString();