DatePattern
字符串需要是可以SimpleDateFormatter
接受的东西。
不幸的是,这意味着,开箱即用,这不包括能够将边界设置为周数。在 C# 中有一些方法可以获取这个值,但是我们可以扩展SimpleDateFormatter
或提供不同的实现IDateFormatter
并使用它(甚至在自定义中RollingFileAppender
)并不明显。
那么我们如何让 Log4NetRollingFileAppender
每周滚动一次呢?
DatePattern
字符串需要是可以SimpleDateFormatter
接受的东西。
不幸的是,这意味着,开箱即用,这不包括能够将边界设置为周数。在 C# 中有一些方法可以获取这个值,但是我们可以扩展SimpleDateFormatter
或提供不同的实现IDateFormatter
并使用它(甚至在自定义中RollingFileAppender
)并不明显。
那么我们如何让 Log4NetRollingFileAppender
每周滚动一次呢?
I got mine rolling every week. You must set your dateformat to include the day of the month to generate unique filenames.
class RollingOverWeekFileAppender : RollingFileAppender
{
private DateTime nextWeekendDate;
public RollingOverWeekFileAppender()
{
CalcNextWeekend(DateTime.Now);
}
private void CalcNextWeekend(DateTime time)
{
// Calc next sunday
time = time.AddMilliseconds((double)-time.Millisecond);
time = time.AddSeconds((double)-time.Second);
time = time.AddMinutes((double)-time.Minute);
time = time.AddHours((double)-time.Hour);
nextWeekendDate = time.AddDays((double)(7 - (int)time.DayOfWeek));
}
protected override void AdjustFileBeforeAppend()
{
DateTime now = DateTime.Now;
if (now >= nextWeekendDate)
{
CalcNextWeekend(now);
// As you included the day and month AdjustFileBeforeAppend takes care of creating
// new file with the new name
base.AdjustFileBeforeAppend();
}
}
}
事情没那么简单。RollingFileAppender 用于DateTime.ToString()
确定“滚动点”。log4net 帮助的声明并没有错,因为它SimpleDateFormatter
也使用这种方法,但它有点误导:您不能注入不同的日期格式化程序来使滚动文件附加程序以您想要的方式工作。
如果您真的需要按周滚动功能,那么最简单的方法是从该方法派生RollingFileAppender
并覆盖该AdjustFileBeforeAppend()
方法。没有对此进行测试,但这应该可以解决问题。
我也面临同样的问题,每周滚动日志文件,通过测试 GLM 解决方案的方法,不知何故它不适用于 log4net 版本(1.2.15.0),但受到他的回答的启发,并研究了源代码,我已经制定了每周按名称生成日志文件的解决方案(命名为星期日的日期)
namespace log4net.Appender
{
class RollingOverWeekFileAppender : RollingFileAppender
{
public RollingOverWeekFileAppender()
{
IDateTime dt = new SundayDateTime();
DateTimeStrategy = dt;
}
class SundayDateTime : IDateTime
{
public DateTime Now
{
get { return CalcThisSunday(DateTime.Now); }
}
private DateTime CalcThisSunday(DateTime time)
{
// Calc this sunday
time = time.AddMilliseconds((double)-time.Millisecond);
time = time.AddSeconds((double)-time.Second);
time = time.AddMinutes((double)-time.Minute);
time = time.AddHours((double)-time.Hour);
return time.AddDays((double)(-(int)time.DayOfWeek));
}
}
}
}
还有我的 log.config 片段
<appender name="Log" type="log4net.Appender.RollingOverWeekFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value=".\log-" />
</file>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<encoding value="utf-8" />
<staticLogFileName value="false"/>
<appendToFile value="true" />
<rollingStyle value="Date"/>
<datePattern value="yyyyMMdd.lo\g"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date	%level	%logger{1}	%message%newline" />
</layout>
</appender>