Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

log4net.ext.json - Custom Stamps

Tags:

json

log4net

I'm trying to write JSON logs with stamped events (currently just a ValueStamp, need a unique guid per log entry). I followed the guide here and my log4net.config looks like so

<log4net>
  <root>
    <loggerFactory type='log4net.Util.Stamps.StampingLoggerFactory, log4net.Ext.Json'>
      <stamp type='log4net.Util.Stamps.ValueStamp, log4net.Ext.Json'>
        <name>stamp</name>
        <value>MyValueHere</value>
      </stamp>
    </loggerFactory>

    <level value="ALL" />
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="JsonFileAppender" />
  </root>
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
    ...      
  </appender>
  <appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender" >
    <param name="File" value="log-file.json" />
    <param name="AppendToFile" value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
      <decorator type="log4net.Layout.Decorators.StandardTypesFlatDecorator, log4net.Ext.Json" />
      <default /> 
      <!--explicit default members-->
      <member value="Stamp:stamp" />
    </layout>
  </appender>
</log4net>

Unfortunately, all I see in my log messages are

{"date":"2015-09-16T17:19:13.7833747-07:00","level":"INFO","appname":"MyApp.exe","logger":"MyApp.Program","thread":"6","ndc":"(null)","message":"Processed request successfully","Stamp":"stamp"}

So my question is: How do I get the Json layout to show me the "MyValueHere" stamp?

like image 316
Ani Avatar asked Feb 06 '26 12:02

Ani


1 Answers

I finally figured it out - I needed to put the loggerFactory before (and outside of) the root element. A working log4net.config looks like this:

<log4net>
  <loggerFactory type="log4net.Util.Stamps.StampingLoggerFactory, log4net.Ext.Json">
    <stamp type="log4net.Util.Stamps.ValueStamp, log4net.Ext.Json">
        <name>stamp</name>
        <value>MyValueHere</value>        
    </stamp>
  </loggerFactory>

  <root>
    <level value="INFO" />
    <appender-ref ref="JsonFileAppender" />
  </root>

  <appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender" >
    <param name="File" value="log-file.json" />
    <param name="AppendToFile" value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
      <decorator type="log4net.Layout.Decorators.StandardTypesFlatDecorator, log4net.Ext.Json" />
      <member value="Stamp:stamp"/>
      <default />
    </layout>
  </appender>
</log4net>

With this config, every log entry comes out with the "MyValueHere" stamp.

like image 111
Ani Avatar answered Feb 09 '26 09:02

Ani