5

文字列は、が受け入れるDatePatternものである必要があります。SimpleDateFormatter

残念ながら、これはそのままでは、境界を週番号に設定できる機能が含まれていないことを意味します。SimpleDateFormatterC# でこの値を取得する方法はありますが、 を拡張したり、 の別の実装を提供しIDateFormatterて代わりに (またはカスタム でさえ) 使用したりできるかどうかは明らかではありませんRollingFileAppender

では、Log4NetRollingFileAppenderを毎週ローリングするにはどうすればよいでしょうか?

4

3 に答える 3

2

私は毎週転がっていました。一意のファイル名を生成するには、日付形式を月の日を含めるように設定する必要があります。

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();
        }
    }
}
于 2011-04-14T20:43:10.600 に答える
1

また、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&#9;%level&#9;%logger{1}&#9;%message%newline" />
  </layout>
</appender>
于 2016-07-02T05:38:56.203 に答える
1

それほど単純ではありません。RollingFileAppender はDateTime.ToString()、「ロール ポイント」を決定するために使用します。もこの方法を使用するため、log4net ヘルプのステートメントは間違っていませんSimpleDateFormatterが、誤解を招く可能性があります。別の日付フォーマッタを挿入して、ローリング ファイル アペンダーを希望どおりに動作させることはできません。

週ごとのロール機能が本当に必要な場合、最も簡単な方法は から派生させてメソッドRollingFileAppenderをオーバーライドするAdjustFileBeforeAppend()ことです。これをテストしませんでしたが、それでうまくいくはずです。

于 2010-09-16T10:47:39.397 に答える