将Log4Net RollingFileAppender设置为每周滚动一次

DatePattern字符串需要是SimpleDateFormatter 将接受的内容 。

不幸的是,这意味着,开箱即用,这不包括能够将边界设置为周数。 有一些方法可以在C#中获取此值,但是我们可以扩展SimpleDateFormatter或提供IDateFormatter的不同实现并使用它(或者甚至在自定义的RollingFileAppender )并不明显。

那么我们怎样才能让Log4Net RollingFileAppender每周滚动一次?

我每周都会开车。 您必须将dateformat设置为包含每月的日期以生成唯一的文件名。

 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使用了这个方法,但它有点误导:你不能注入不同的日期格式化程序来使滚动文件appender按你想要的方式工作。

如果你真的需要逐周特征,那么最简单的方法是从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片段