log4net - 仅在一天中的特定时间安排日志记录

log4net - scheduling logging only between certain hours of the day

您能否将日志附加程序配置为仅在一天中的特定时间输出,例如每天 08:00 和 19:00 之间?在这些时间之外记录 activity 将被忽略,并且不会被 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 之间登录?

您可以使用过滤器来执行此操作,最简单的方法可能是通过在一天中的时间超出范围时覆盖 FilterSkeleton 和 returning Decide 方法来编写自己的过滤器用于记录。确保return Neutral if logging should be done,这样你就可以在过滤器链中首先使用你的自定义过滤器,如果你需要的话仍然可以在它之后应用其他过滤器,returning Accept总是记录并忽略其他过滤器。

请参阅 this SO question 了解一些代码和配置示例,了解如何将它们组合在一起。

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

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>