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>
您能否将日志附加程序配置为仅在一天中的特定时间输出,例如每天 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>