2017-01-24 9 views
0

私はC#でlog4netを使って私のアプリをログしています。%property {PropertyName}を動的に設定することはできますか?

私はこのようにそれを行うことができます知っている:

GlobalContext.Properties["PropertyName"] = "NewValue"; 
XmlConfigurator.Configure(); 

そして、それは動作します。 しかし、新しい値を設定するためにConfigureを再度呼び出さなければならないので、動的ではありません。 ILog.Infoを呼び出す前にプロパティ値を設定する方法はありますか?そのような

何か:

//here I set a new value for %property{PropertyName} 
log.Info("Value to log"); 

//here I set a another one for %property{PropertyName} 
log.Info("Value to log 2"); 

答えて

0

あなたのPatternLayoutはのconversionPatternで%property{PropertyName}を使用することができ、そしてあなたは、新しい値を使用して、プロパティ値を変更するたびに記録されます。

FileAppenderのファイル名やディレクトリなどのアペンダー設定プロパティーにプロパティーを使用する場合は、もちろんプロパティー値を変更した後に再構成する必要があります。

+0

ありがとうございましたが、私は既にその方法で達成しています。私はもっ​​と柔軟なものが必要です。 –

+0

@ ramires.cabral - 多分あなたに必要なものを教えてください。 – Joe

+0

私はILog.Infoを呼び出すたびにプロパティを変更できるようにします。私は、アプリケーション内のいくつかのイベントに基づいてファイルに新しい名前を付けたいと思います。 ThreadContext.Propertiesを使用すると可能ですが、Configureを呼び出さなくてもいいです。そして、複数のタスクでそれを実行すると、正しく動作しません。 Log4netの経験はありません。おそらくこれは間違ったアプローチです。 –

0

Log4Netはさまざまなコンテキストをサポートしています。あなたが見つけたようにGlobalContextがその1つです。 ThreadContextは別である、と私はあなたのシナリオでより適切であると思う:

log4net.ThreadContext["PropertyName"] = "NewValue"; 

Configureを呼び出す必要はありません。 ThreadContextで設定されたプロパティは、現在のスレッドからロガーへの呼び出しで使用できます。通常の方法でアペンダの設定内のプロパティを参照:@joeコメントに基づいて

%property{PropertyName} 
+0

あなたはlog4net.ThreadContext.Properties ["PropertyName"]を意味すると思います。とにかく、あなたの例を試しましたが、私はXmlConfiguratorを呼び出さなければなりませんでした。Configure();働く –

0

私は次のように私自身のアペンダを書いてきました:

public class MyCustomAppender : RollingFileAppender 
{ 
    bool firstRun = true; 
    string fileNamePattern = null; 

    protected override void Append(LoggingEvent loggingEvent) 
    { 
     CloseFile(); 
     File = fileNamePattern.Replace("__filename__", ThreadContext.Properties["PropertyName"].ToString()); 
     LockingModel.OpenFile(File, true, Encoding.UTF8); 
     LockingModel.AcquireLock(); 
     OpenFile(File, true); 

     base.Append(loggingEvent); 
     DoAppend(loggingEvent); 
    } 

    public override string File 
    { 
     get 
     { 
      if (firstRun) 
      { 
       firstRun = false; 
       fileNamePattern = base.File; 
      } 

      return base.File; 
     } 

     set 
     { 
      base.File = value;    
     } 
    } 
} 

そしてそれは、どのを意味するものではありません、動作します正しい。私はそれがオーバーロード内の良いことであるかどうかわからないメソッドのクローズを追加し、ロックを取得し、何かをログオンするたびにファイルを開く。 考えていますか?

関連する問題