42

Currently my application is using log4net to log errors, the web.config for this is as followed:

<log4net> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="c:/paypal/logs/gateway.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>

However, the problem with this is that everyday the logs always go to gateway.log

Does anybody know a way to have a different log file per day using log4net?

Ideally I don't want to have to manually edit the web.config every night using a scheduled task.

Philipp M
  • 1,877
  • 7
  • 27
  • 38
swade1987
  • 1,663
  • 5
  • 21
  • 28

3 Answers3

85

You should use RollingFileAppender with rollingStyle Date and datePattern yyyyMMdd (this will roll every day).

Example of configuration:

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="c:/paypal/logs/gateway.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
    </layout>
</appender>

UPDATE: I think a better way is to include the date into file name. And use datePattern value only to show when new log file should be created.

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="c:/paypal/logs/gateway_%date{yyyyMMdd}.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value="yyyyMMdd" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
  </layout>
</appender>

In this case all your files will have name like gateway_20120427.log.

Philipp M
  • 1,877
  • 7
  • 27
  • 38
Sergey Berezovskiy
  • 232,247
  • 41
  • 429
  • 459
  • 7
    @swade1987 this configuration will create `gateway.log` file. When you'll try to write something to log other day, then current `gateway.log` will be renamed to `gateway.log20120427` and new `gateway.log` file will be created. See http://stackoverflow.com/questions/1165084/log4net-rolling-daily-filename-with-date-in-the-file-name about changing file name. Btw `` will work. – Sergey Berezovskiy Apr 27 '12 at 11:44
  • so using the URL you provided for today the log file would be 27.04.2012.log, correct? – swade1987 Apr 27 '12 at 11:52
  • 2
    @swade1987 actually RollingFileAppender simply adds to the file name what you describe in datePattern. So, if you want `gateway_20120427.log`, then you should have file name `gateway` and datePattern `_yyyyMMdd'.log'`. Current log file will be without extension. – Sergey Berezovskiy Apr 27 '12 at 11:58
  • does this need the tags too? – swade1987 Apr 27 '12 at 14:27
  • @swade1987 if you want all loggers in your application to use this RollingFileAppender, then yes, you should add it to root logger. See configuration settings here http://logging.apache.org/log4net/release/manual/configuration.html – Sergey Berezovskiy Apr 27 '12 at 14:34
  • @swade1987 just replace your appender definition with provided in answer. Root and other staff leave as is. – Sergey Berezovskiy Apr 27 '12 at 14:35
  • 2
    is fine for the first day, but when the day rolls over the file becomes gateway_yyyyMMdd.logyyyyMMdd. Change to and log files will have the correct format except for the current day – Tim Partridge May 20 '14 at 18:14
  • 3
    I ended up combining the answer and several comments to get something that gave correct results *and* looked reasonable (e.g. the parts of the name where in tags with a related name): `` `` `` `` `` creates filenames (including current day) like `MyApp_2017-05-30.log`. – brichins May 30 '17 at 15:22
  • @brichins provides a good solution. Also note that you can change the date pattern to make it easier to test your log4net configuration. For example, I used this date pattern to create a new log file for each minute, for ease of testing: `` – srk Dec 03 '19 at 20:53
14

Like using the RollingFileAppender

<appender name="RollingLogFileAppenderOutput" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="c:\my.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMdd'.log'" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%date [%thread] %-5level - %message%newline" />
    </layout>
</appender>

edit

This is the whole log4net configuration section to roll everyday, the same as @lazyberezovsky answered just adding the log4net and root for clarification

edit2 <file value="c:/paypal/logs/gateway_" /> this will create a file named 'gateway_' and at the end of the day (2012-04-27) it will be renamed as gateway_20120427.log and the next day (2012-04-28) it will create again the file gateway_ and at the end it'll create gateway_20120428.log.

<log4net> 
    <appender name="RollingLogFileAppenderOutput" type="log4net.Appender.RollingFileAppender">
        <file value="c:/paypal/logs/gateway_" />
        <appendToFile value="true" />
        <rollingStyle value="Date" />
        <datePattern value="yyyyMMdd'.log'" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level - %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingLogFileAppenderOutput" />
    </root>
</log4net>
Philipp M
  • 1,877
  • 7
  • 27
  • 38
jjchiw
  • 4,375
  • 1
  • 29
  • 30
  • So to clarify if I want c:/paypal/logs/gateway_20120427.log for example, how EXACTLY do I setup the config? – swade1987 Apr 27 '12 at 11:28
  • 2
    This is why we stopped using log4net. Way too complicated and always nightmare with configs. Its like WCF vs ZeroMQ. Start using NLog. Much clearer and easier. – nerijus Jun 23 '13 at 09:12
  • 1
    @swade1987 Don't forget to add: ``, or your log file name may not change!! – seebiscuit Feb 07 '14 at 19:15
9

PreserveLogFileName

This setting keeps the extension of the file the same after you roll the log.

<log4net> 
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="c:/paypal/logs/gateway.log" />
        <appendToFile value="true" />
        <rollingStyle value="Date" />
        <datePattern value="_yyyyMMdd" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
        </layout>
        <preserveLogFileNameExtension value="true" />
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>
Barry Colebank Jr
  • 1,939
  • 2
  • 16
  • 16