如何通过记录器改变追加器的行为



>我有一个追加器,它调用存储过程来写入日志记录。它看起来像这样(为简洁起见进行了修剪):

<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>

请注意,消息参数的大小字段设置为 40,000。

我有一个记录器,但是我需要更长的消息长度。如何更改该特定记录器的此设置。我尝试克隆 LogAppender 并更改大小值,如下所示:

<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>

但这会导致来自 SpecialLogger 的消息被记录两次,一次由 LogAppender 记录,一次由 SpecialLogAppender 记录。 有什么想法吗?

您需要

additivity="false"添加到特殊记录器定义中:

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

您需要向 log4net 追加器添加一个合适的<filter>元素。看

  • http://logging.apache.org/log4net/release/manual/configuration.html#filters
  • http://logging.apache.org/log4net/release/sdk/log4net.Filter.html
  • http://logging.apache.org/log4net/release/sdk/index.html

Log4net 追加器按文档顺序进行检查,因此您的特殊追加器需要在默认追加器之前。那么像这样的事情应该做哟:

<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>

最新更新