2013-06-17 1 views
6

アプリケーションの実行中にfileappenderのログファイルの名前を変更することはできますか? これは1日に数回行われます。ランタイム中にログファイルの名前を数回変更する

私はもう少し詳しく説明しよう:私のアプリはデバイスにファームウェアを書き込む。ユーザーがすでに作業していたすべてのデバイスはグリッド内にあります。ユーザーは、新しい書き込みウィザードを開始することができます。または、すでに起動しているデバイスでアクションを再開または再開できます。 私がしたいのは、特定のデバイスに対してユーザーが実行したすべてのステップのログを保持することです。

たとえば、ユーザーがデバイスAB0124で作業しているときに、AB0124.logというログファイルに書き込みたいとします。彼はそのデバイスに取り組んで終了し、デバイスXY5618上で起動すると、私はそれがコンテキスト・プロパティ(herehereや他の記事の多くを)使用することは可能だと私は読んだXY5618.log

にそれらのアクションを記録したいですただし、ロガーを作成する前にプロパティを設定する必要があります。 したがって、クラス内にロガーを作成するのではなく、プロパティを設定した後にメソッド内にロガーを作成します。 これまでに何も記録されていません。

configにハードコードされたファイル名を設定すると動作します。 ここには何か不足していますか?

Log4Net.config:

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender"> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="INFO"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{dd/MM/yyyy - HH:mm:ss} - %message%newline" /> 
    </layout> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="StepsLogAppender" /> 
</root> 

のC#:

public void WriteStepInfo(string device, int step) 
{ 
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device); 
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    log.Info(string.Format("Device {0} - step {1}.", device, step)); 
} 

そしてAssemblyInfo.csで

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

答えて

7

ピーターの答えは正しい方向に私をもたらしましたが、私はコードで編集ファイルを保存したままでやりました。

public void WriteStepInfo(string device, int step) 
{ 
    var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 
    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a.Name == "StepsLogAppender") 
     { 
      FileAppender fa = (FileAppender)a; 
      var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device); 

      fa.File = logFileLocation; 
      fa.ActivateOptions(); 
      break; 
     } 
    } 

    Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step)); 
} 
+0

ありがとうございます。正確に私が必要なもの! – AngieM

+0

これは私が見つけた最良の実装です...ありがとうございました... – Emerson

1

ヨあなたのアプリケーションからlog4net.configファイルを開き、名前を変更することができます。次にファイル(log4net.config)を保存すると、ロギングファイルが変更されます。

関連する問題