質問

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?

役に立ちましたか?

解決

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

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

他のヒント

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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top