log4net - 仅在一天中的某些小时之间安排日志记录

时间:2017-05-19 17:40:14

标签: c# log4net

您是否可以将日志追加器配置为仅在当天的某些时段(例如每天08:00到19:00)之间输出?超出这些小时数的记录活动将被忽略,并且不会被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>

所以,如何将此配置为仅在白天的08:00和19:00之间进行记录?

2 个答案:

答案 0 :(得分:1)

您可以使用过滤器来执行此操作,最简单的可能是通过覆盖FilterSkeleton来编写自己的过滤器,并且如果时间超出记录范围,则从Decide方法返回Deny。如果要进行日志记录,请确保返回Neutral,这样您就可以在过滤器链中首先使用自定义过滤器,并在需要时仍然应用其他过滤器,返回Accept将始终记录并忽略其他过滤器。

有关如何将这些内容放在一起的一些代码和配置示例,请参阅this SO question

答案 1 :(得分:0)

@Matt提到的过滤器是一种更通用的方法。 但是,如果您确定只想登录文件,则可以创建源自RollingFileAppender的自定义appender。 像这样:

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);
        }
    }
}

然后在配置中:

<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>