Carlos Alba Zamanillo
Carlos Alba Zamanillo

Reputation: 1319

How to define different logger levels per appenders

I'm trying to define 2 independent appenders to log into to 2 files. I define DEBUG level for the "DebugAppender" and then for the "RelevantAppender" I define different levels for the "Security" and "ServerStats" loggers.

The thing is that these loggers definitions are overwriting my "DebugAppender" levels and now it's not in DEBUG mode (all the loggers).

How can make it work as expected?

<log4net>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
    <file value="plastic.debug.log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value=".yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %thread %property{TransactionID} %property{ClientMachine} %-5level %logger - %message%newline" />
    </layout>
</appender>

<appender name="RelevantAppender" type="log4net.Appender.RollingFileAppender">
    <file value="plastic.relevant.log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value=".yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %property{ClientMachine} %-5level %logger - %message%newline" />
    </layout>`enter code here`       
</appender>


<logger name="Security">
    <level value="ERROR" />
    <appender-ref ref="RelevantAppender" />
</logger>

<logger name="ServerStats">
    <level value="INFO" />
    <appender-ref ref="RelevantAppender" />
</logger>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="DebugAppender" />
  </root>  

Upvotes: 3

Views: 1763

Answers (1)

jan-seins
jan-seins

Reputation: 1283

You're problem is, that the definition you make in Logger outweights all following levels. So here comes my solution:

<log4net>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
  <file value="plastic.debug.log.txt" />
  <!--...-->
</appender>

<appender name="Security_RelevantAppender" type="log4net.Appender.RollingFileAppender">
  <threshold value="ERROR" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <file value="plastic.relevant.log.txt" />
  <!--...-->
</appender>

<appender name="Serverstat_RelevantAppender" type="log4net.Appender.RollingFileAppender">
  <threshold value="INFO" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <!--...-->
</appender>


<logger name="Security">
  <appender-ref ref="Security_RelevantAppender" />
</logger>

<logger name="ServerStats">
  <appender-ref ref="Serverstat_RelevantAppender" />
</logger>

<root>
  <level value="DEBUG" />
  <appender-ref ref="DebugAppender" />
</root>
</log4net>

Define 3 different appenders. The DebugAppender's level is defined by <root>. The two relevant appenders write both to the same file with different log-levels (thresholds). It is important, that you include the locking model <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />. Utherwise the first appender you call will lock the file and the second one can not write in it (Can Log4net have multiple appenders write to the same file?). In the <logger> you just define the two different appenders and no loglevel. This way it will take the level from the appender settings.

When you do it like this all events of the type debug+ from any logger will be written to plastic.debug.log.txt. To plastic.relevant.log.txt only events error+ from security-logger and info+ from serverstat-logger are written.

Hope this helps

Upvotes: 3

Related Questions