22
votes

I'm using a RollingFileAppender to log some info to a file with a conversionPattern (in the web.config) that looks like this for the header of each log section:

<conversionPattern value="%date - %property{userId} - %property{method}%newline--------------------------------%newline%message%newline%newline"/>

I'd like to log details under this header as bullet points. I'm currently trying to use another RollingFileAppender that logs to the same file with a simple conversionPattern of just a dash, like this:

<conversionPattern value="- %message%newline"/>

But these messages aren't making it into the log file. I'm using Log.Info() for the header and Log.Debug() for the bullet points and filtering each appender on their respective log levels. Is what I'm trying to do possible? Or is there a better way to get header and detail information into a log file from log4net?

2

2 Answers

39
votes

Yes you can have two log4net appenders that append (write) to the same log file.

You need to place the following line in each of your Appenders:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

This will make log4net use a minimal locking model that allows multiple processes to write to the same file.

Here's an example XML that uses two appenders writing to the same log file:

<log4net debug="false">
<appender name="RollingLogFileAppender1" type="log4net.Appender.RollingFileAppender">
  <!-- this configures a log for the application messages -->
  <file value="TestLog.log" />
  <appendToFile value="true" />
  <!-- next line uses a minimal locking model that allows multiple processes to write to the same file -->
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <!-- make the most recent log the highest numbered log -->
  <countDirection value="1" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5level %date{MM-dd-yyyy HH:mm:ss.ff} [%property{NDC}] %message%newline [Thread: %thread] %c{1} Method:%method(%file{1}, Line:%line) %newline" />
  </layout>
  <!-- The following two filters insure only log requests of 
        version '1' use this Appender -->
</appender>
<appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
  <file value="TestLog.log" />
  <appendToFile value="true" />
  <!-- next line uses a minimal locking model that allows multiple processes to write to the same file -->
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <!-- make the most recent log the highest numbered log -->
  <countDirection value="1" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5level %date{MM-dd-yyyy HH:mm:ss.ff} [%property{NDC}] [Thread: %thread] %c{1} Method:%method(%file{1}, Line:%line) %newline%message" />
  </layout>
</appender>
<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingLogFileAppender1" />
  <appender-ref ref="RollingLogFileAppender2" />
</root>

This can be found in the Apache documentation here: Apache Log4Net Docs Just search on this page for 'same file'.

Hope this helps.

1
votes

You could realize if there is any problem with log4net checking the output window on visual studio. The library log errors there, very useful to detect configuration mistakes.