2013-06-17 7 views
6

Ist es möglich, den Namen einer Protokolldatei für einen Dateianwender ändern, während die Anwendung ausgeführt wird? Es wird ein paar Mal/Tag getan werden.Ändern Sie den Namen der Protokolldatei während der Laufzeit einige Male

Ich werde versuchen, mich ein wenig mehr zu erarbeiten: Meine App schreibt Firmware auf einem Gerät. Alle Geräte, an denen der Benutzer bereits gearbeitet hat, befinden sich in einem Raster. Der Benutzer kann einen neuen Schreibassistenten starten oder die Aktion auf einem bereits gestarteten Gerät fortsetzen oder neu starten. Was ich tun möchte, ist ein Protokoll über alle Schritte, die der Benutzer für ein bestimmtes Gerät ausführt.

Beispiel: Wenn der Benutzer auf dem Gerät AB0124 arbeitet, möchte ich in eine Protokolldatei namens AB0124.log schreiben. Wenn er mit der Arbeit an diesem Gerät endet und auf dem Gerät XY5618 startet, möchte ich diese Aktionen in XY5618.log protokollieren

Ich habe gelesen, dass es möglich ist, eine Context-Eigenschaft (here und here und viele andere Beiträge) zu verwenden , aber Sie müssen die Eigenschaft festlegen, bevor Sie den Logger erstellen. Anstatt also einen Logger in der Klasse zu erstellen, erstelle ich einen in meiner Methode nach dem Festlegen der Eigenschaft. Aber bis jetzt wird nichts geloggt.

Wenn ich den Dateinamen hardcodiert in der Konfig, funktioniert es. Fehle ich hier etwas?

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)); 
} 

Und in den AssemblyInfo.cs:

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

Antwort

7

Die Antwort von Peter brachte mich in die richtige Richtung, aber am Ende habe ich es in Code gemacht, anstatt die Konfigurationsdatei zu bearbeiten und zu speichern.

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

Danke für das Beispiel. Genau das, was ich brauche! – AngieM

+0

Dies ist die beste Implementierung, die ich gefunden habe ... Danke ... – Emerson

1

Yo Sie können die Datei log4net.config aus Ihrer Anwendung öffnen und den Namen ändern. Speichern Sie dann die Datei (log4net.config) und die Protokolldatei wird geändert.

Verwandte Themen