139

I'd like to write log to 2 different log files from the same process.

is that possible thing to do using log4net?

I'll need to write separate messages to each log file. how can I write a message to a specific appender?

GEOCHET
  • 21,119
  • 15
  • 74
  • 98
ofer
  • 4,366
  • 9
  • 38
  • 39
  • 3
    You can't log to separate appenders - you need to configure different loggers, and attach the appropriate appender to each one. Then log different messages to the different loggers. – Vinay Sajip Sep 03 '09 at 11:51
  • Here's how I did it with code-as-configuration: http://stackoverflow.com/questions/27846157/configure-log4net-to-write-to-different-log-files-no-config-files – Jay Sullivan Jan 09 '15 at 21:34

5 Answers5

215

These answers were helpful, but I wanted to share my answer with both the app.config part and the c# code part, so there is less guessing for the next person.

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

Then in code:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

Here c:/Console.txt will contain "Processing" ... and \SummaryFile.log will contain "Processing2"

Philipp M
  • 1,877
  • 7
  • 27
  • 38
Gary
  • 3,254
  • 2
  • 27
  • 30
88

Yes, just add multiple FileAppenders to your logger. For example:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>
Philipp M
  • 1,877
  • 7
  • 27
  • 38
Vinay Sajip
  • 95,872
  • 14
  • 179
  • 191
  • 6
    Nice ..:) however, I'll need to write separate messages to each log file. how can I write a message to a specific appender? thanks. ofer – ofer Sep 03 '09 at 10:49
  • 2
    @ofer- see my answer on how to do that. – RichardOD Sep 03 '09 at 15:48
  • 1
    What if you want File1Appender to log DEBUG errors and File2Appender to log ERROR errors? – JsonStatham May 08 '14 at 13:48
  • I'm trying to achieve similar stuff. Would be glad if you can answer my question: http://stackoverflow.com/questions/24886364/log4net-writing-to-different-files – Ashish Charan Jul 22 '14 at 11:52
63

Vinay is correct. In answer to your comment in his answer, one way you can do it is as follows:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

This is how I have done it in the past. Then something like this for the other log:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

And you can get your normal logger as follows:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Read the loggers and appenders section of the documentation to understand how this works.

Philipp M
  • 1,877
  • 7
  • 27
  • 38
RichardOD
  • 28,883
  • 9
  • 61
  • 81
  • 4
    I have this *same* setup in one of my apps and it doesnt work for me :( – Román Sep 08 '10 at 12:25
  • 1
    This discussion is very old...hope you can reply...I tried your approach but the two loggers log the same messages. As in log.Info("") and otherLog.Info("") write messages to both the log files simultaneously. – SutharMonil Jan 14 '14 at 07:46
  • 1
    @daniel_aren Yes, what i did was i used the appender block to create two appenders with separate file paths (just like the one above this one)....so effectively we have two appender blocks with names : fileappender1 and fileappender2.... – SutharMonil Oct 26 '14 at 08:29
  • 1
    @SutharMonil simply add 'additivity="false" to the logger node, as in answer by Gary and highlighted by Jason Hernandez. In this case it will still put all messages in root but only messages from otherLog.Info("") will appear in File1Appender2 – freedomn-m Nov 06 '14 at 09:42
  • By far the most accurate answer. – Fabricio Aug 09 '17 at 17:06
  • 1
    LogManager.GetLogger("SomeName"); get an error cannot convert from string to System.Type. What is missing? – Benk May 22 '19 at 19:40
46

I wanted to log all messages to root logger, and to have a separate log with errors, here is how it can be done:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>

Notice the use of filter element.

Philipp M
  • 1,877
  • 7
  • 27
  • 38
Valentin Kuzub
  • 11,703
  • 7
  • 56
  • 93
5

Use below XML configuration to configure logs into two or more files:

<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

Above XML configuration logs into two different files. To get specific instance of logger programmatically:

ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

You can append two or more appender elements inside log4net root element for logging into multiples files.

More info about above XML configuration structure or which appender is best for your application, read details from below links:

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html

Adrian Mole
  • 49,934
  • 160
  • 51
  • 83
Rakesh Chaudhari
  • 3,310
  • 1
  • 27
  • 25