web-dev-qa-db-ja.com

アペンダーファイルのパスを動的に設定する最良の方法

私が書いた構文を検証するために、私より賢い人を見つけようとしています。私のプロジェクトで再利用しやすくするために、RollingFileAppenderのファイル名をアセンブリの名前に構成するという考え方です。

この前のSO記事 を見ましたが、私の質問に正確に答えることができませんでした...

私はLog4netの内部コンポーネントを理解しようと試みてきましたが、これが私が思いついたことです(Global.asaxファイルにあります-Application_Startメソッド):

// Bind to the root hierarchy of log4net
log4net.Repository.Hierarchy.Hierarchy root = 
  log4net.LogManager.GetRepository() 
    as log4net.Repository.Hierarchy.Hierarchy;

if (root != null)
{
  // Bind to the RollingFileAppender
  log4net.Appender.RollingFileAppender rfa = 
    (log4net.Appender.RollingFileAppender)root.Root.GetAppender("RollingLogFileAppender");

  if (rfa != null)
  {
    // Set the file name based on the Assembly name
    string filePath = 
      string.Format("~/App_Data/{0}.log", GetType().Assembly.GetName().Name);

    // Assign the value to the appender
    rfa.File = Server.MapPath(filePath);

    // Apply changes to the appender
    rfa.ActivateOptions();
  }
}

「これは恐ろしい」または「これはうまくいくはずです」と誰にでも言うことができますか?また、ファイルを動的に設定した場合、log4net.configファイルの設定に基づいてlog4netの動作がファイルを回転させることを期待できますか?

大変感謝いたします!

36
Dscoduc

あなたはこれを難しい方法でやっています!アプリケーションの構成ファイルでlog4net構成をXMLとして定義し、%property{}利点:

<appender name="YourAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />
  ....
</appender>

これは動的です。log4netプロパティ "LogName"を設定するだけですbefore log4netを初期化します。したがって、log4netを構成する前の任意のコードで、このプロパティの目的の値を設定します。

string LogName = GetType().Assembly.GetName().Name + ".log";
log4net.GlobalContext.Properties["LogName"] = LogName;

もちろん、任意のプロパティ名を使用できます。簡単な例として「LogName」を選択しましたが、必要に応じてアプリケーションごとに1つ持つことができます。ただし、コードが正しいプロパティ名と正しい値を知っている限りです。

93
Eddie

2015年には、次のようにします。

<file type="log4net.Util.PatternString">
  <conversionPattern value="%appdomain.log" />
</file>

他のコードは必要ありません。

アプリドメインは、実行中のアセンブリのファイル名です。

9
Sebastian Häni

実行時に最初のアペンダーのログファイルを設定または変更する方法は次のとおりです。

var appender = (log4net.Appender.FileAppender)LogManager.GetRepository().GetAppenders()[0];
appender.File = "C:\whatever.log";
appender.ActivateOptions();
9

日付で私のために働いた_<file type="log4net.Util.PatternString" value="./Log/logQueueService%date{yyyy_MM_dd}.log" />

4