2

Can you configure a log appender to only output between certain hours of the day such as between 08:00 and 19:00 each day? Logging activity outside of those hours is ignored and not logged by an appender.

<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value=".output.log"/>
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <appendToFile value="true"/>
  <rollingStyle value="Date"/>
  <datePattern value="yyyyMMdd"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d [%t] %-5p %m%n"/>
  </layout>
</appender>
<root>
  <level value="DEBUG"/>
  <appender-ref ref="RollingLogFileAppender"/>
</root>

So the above, how could I configure this to only log between 08:00 and 19:00 during the day?

frimley
  • 212
  • 5
  • 9

2 Answers2

1

You can use a filter to do this, simplest would probably be to write your own by overriding FilterSkeleton and returning Deny from the Decide method if the time of day is out of range for logging. Make sure to return Neutral if logging should be done, this way you can have your custom filter first in the filter chain and still apply other filters after it if you need to, returning Accept would always log and ignore other filters.

See this SO question for some code and config examples on how to fit this together.

Community
  • 1
  • 1
Matt
  • 12,569
  • 4
  • 44
  • 42
1

Filter as mentioned by @Matt is one, more generic way to do this. But if you're sure you just want log into file, you can create custom appender that derives from RollingFileAppender. Like so:

namespace YourNameSpace
{
    public class TimeBoundedRollingFileAppender : RollingFileAppender
    {
        public int LogFrom { get; set; }
        public int LogTo { get; set; }

        protected override bool FilterEvent(LoggingEvent loggingEvent)
        {
            var currentHour = DateTime.Now.Hour;
            if (currentHour <= LogFrom || currentHour >= LogTo)
            {
                return false;
            }

            return base.FilterEvent(loggingEvent);
        }
    }
}

And then in configuration:

<log4net>
  <appender name="TimeBoundedAppender" type="YourNameSpace.TimeBoundedRollingFileAppender, YourNameSpace">
    <file value=".output.log"/>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value="yyyyMMdd"/>
    <LogFrom>8</LogFrom>
    <LogTo>19</LogTo>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %m%n"/>
    </layout>
  </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="TimeBoundedAppender"/>
    </root>
</log4net>
yoger
  • 282
  • 3
  • 15