aonim
@aonim (minoa)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C#でlog4netを使って、週ごとにログを出力したい

Q&A

Closed

解決したいこと

log4netのDLLを使って、クラスを作っています。
Dateによって、ログを出力します。
でも週ごとと年ごとはうまくできません。

発生している問題・エラー

+       $exception  {"Invalid RollPoint, unable to parse ['Logs-'yyyy-ww'.log']"}   System.ArgumentException

該当するソースコード

        public void LoadRollingFileAppender(string filename, string floder, int fileQuantity)
        {           
            RollingFileAppender appender = new RollingFileAppender();
            appender.AppendToFile = true;                  
            appender.Name = "RollingFile";
            appender.DatePattern = filename;                
            appender.File = floder;                         
            appender.RollingStyle = RollingFileAppender.RollingMode.Date; 
            appender.MaximumFileSize = "10MB";             

            appender.MaxSizeRollBackups = fileQuantity;    

            appender.StaticLogFileName = false;
            appender.LockingModel = new FileAppender.MinimalLock(); 

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = _ConversionPattern;   
            patternLayout.ActivateOptions();
            appender.Layout = patternLayout;

            appender.Encoding = Encoding.UTF8;

            LevelRangeFilter filter = new LevelRangeFilter();
            filter.LevelMax = Level.Fatal;
            filter.LevelMin = Level.Debug;

            appender.AddFilter(filter);
            appender.ActivateOptions(); // ここでエラーを発生します。

            BasicConfigurator.Configure(appender);            
        }

ファイル名のフォマード:'Logs-'yyyy-ww'.log'
他のフォーマット:'Logs-'yyyy-MM-dd'.txt' 'Logs-'yyyy-MM'.txt'などは問題ないです。

どこが間違っているか、を教えてもらえば、ありがたいです。

0

5Answer

「該当するソースコード」に肝心な「エラーになったフォーマット文字列」がない。
エラーメッセージではunable to parse ['Logs-'yyyy-ww'.log']なのに本文中では「ファイル名のフォーマット:Logs-yyyy-ww.txt」と大きく違う。
エラーの原因と思われる情報がまったく信用できないので答えようがない。


log4netは使ったことないですが、DatePatternがwwをサポートしているか確認した方がいいんじゃないでしょうか?
軽く検索したらlog4jの情報しか出てこなくて、log4jではこの部分でjavaの書式指定を利用しているので、標準ライブラリの日時書式指定にwwがない.NETではサポートしていない可能性があります。

0Like

Comments

  1. @aonim

    Questioner

    ['Logs-'yyyy-ww'.log']は自分で決める文字を''の中に置きます。'Logs-'と'.log'は自分で修正できる文字です。['Logs-'yyyy-MM'.txt']を正しく出力できます。週ごとで出力の配置があって、やり方がわかりません。
  2. > .NETではサポートしていない可能性があります。

    と書いたように、まず週ごとの出力が「可能なのか」をリファレンスマニュアルなりで確認した方がいいと思います。
  3. リンク先はjavaのlogbackなので…
    `ww`の書式文字列がjavaにはあるけど.NETにはないものなので、log4netがサポートしているという直接的なソースでないと確信が持てないです。
    たとえば「log4jからの移植なので内部的にTopOfWeekはサポートしているけど、書式指定文字列`ww`はサポートしていないので実質使用できない」といったこともあり得なくはないです。
  4. @aonim

    Questioner

    意味が分かりました。何回返信して、とてもありがとうございます。ほかのやり方を探します。

あると思います。TopOfWeekの項目があって、でも上記のwwを設定すると、Invalid RollPoint無効的な設定になりました。
1.PNG

0Like

Comments

  1. 「一週間分ずつ別のファイル」をlog4netで実現するなら、Appenderを自作でもいいかもしれませんね。

@Yamazin さん

一瞬、それならいけるかも?と思いましたが
'Logs-'yyyy-ww'.log' に期待しているのは「一週間分ずつ別のファイル」(週に一度別ファイルに切り替わる)なのに対して
'Logs-'yyyy-ddd'.log' だと「曜日ごとに別のファイル」(毎日別ファイルに切り替わる)なので、
残念ながらうまくいきそうにないですね…

javaのwwに相当するものはDateTime.DayOfYearで取得できるんですが、書式指定文字列としてこれを取り出す方法は用意されていないようです。

0Like

Your answer might help someone💌