Question

I have an appender that calls a stored procedure to to write a log record. It looks like this (trimmed for brevity):

<log4net>
  <root>
    <level value="WARN" />
    <appender-ref ref="ElsAppender" />
  </root>
  <appender name="LogAppender" type="LoggerAssembly.Appender, LoggerAssembly">
    <bufferSize value="1" />
    <reconnectonerror value="True" />
    <parameter>
      <parameterName value="@EntryDate" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="40000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
  </appender>
</log4net>

Note the size field of the message parameter is set to 40,000.

I have a logger however where I need the message length to be much longer. How do I change this setting for that specific logger. I tried cloning the LogAppender and changing the size value, like this:

<log4net>
  <root>
    <level value="WARN" />
    <appender-ref ref="LogAppender" />
  </root>
  <logger name="SpecialLogger">
    <level value="INFO" />
    <appender-ref ref="SpecialLogAppender" />
  </logger>
  <appender name="LogAppender" type="LoggerAssembly.Appender, LoggerAssembly">
    <bufferSize value="1" />
    <reconnectonerror value="True" />
    <parameter>
      <parameterName value="@EntryDate" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="40000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
  </appender>
  <appender name="SpecialLogAppender" type="LoggerAssembly.Appender, LoggerAssembly">
    <bufferSize value="1" />
    <reconnectonerror value="True" />
    <parameter>
      <parameterName value="@EntryDate" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="400000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
  </appender>
</log4net>

but that results in the message from the SpecialLogger being logged twice, once by the LogAppender and once by the SpecialLogAppender. Any ideas?

Was it helpful?

Solution

You need to add additivity="false" to your special logger definition:

<logger name="SpecialLogger" additivity="false">
  <level value="INFO" />
  <appender-ref ref="SpecialLogAppender" />
</logger>

OTHER TIPS

You need to add a suitable <filter> element to your log4net appender(s). See

Log4net appenders are checked in document order, so your special appender needs to precede the default appender. Then something like this ought to do yo:

<appender name="SpecialAppender" type="log4net.Appender.FileAppender">
  <file value="log.txt" />
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="your-logger-name-here">
    <acceptOnMatch="true"
  </filter>
  <layout type="log4net.Layout.SimpleLayout" />
</appender>
<appender name="DefaultAppender" type="log4net.Appender.FileAppender">
  <file value="log.txt" />
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="your-logger-name-here">
    <acceptOnMatch="false"
  </filter>
  <layout type="log4net.Layout.SimpleLayout" />
</appender>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top