2017-01-24 5 views
0

Ich verwende log4net mit C#, um meine App zu protokollieren.Es ist möglich,% Eigenschaft {PropertyName} dynamisch festzulegen?

Ich weiß, dass ich es wie folgt tun:

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

Und es funktioniert. Aber es ist nicht so dynamisch, da ich Configure erneut aufrufen muss, um einen neuen Wert zu setzen. Gibt es eine Möglichkeit, einen Eigenschaftswert vor dem Aufruf von ILog.Info festzulegen?

So etwas:

//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"); 

Antwort

0

Sie %property{PropertyName} im conversionPattern Ihrer Pattern verwenden können, und Sie werden einen neuen Wert erhalten jedes Mal, wenn der Wert der Eigenschaft ändern protokolliert.

Wenn Sie eine Eigenschaft für Appender-Konfigurationseigenschaften verwenden, z. B. einen Dateinamen oder ein Verzeichnis für einen FileAppender, müssen Sie nach der Änderung des Eigenschaftswerts natürlich neu konfigurieren.

+0

Danke, aber das habe ich schon so geschafft. Ich brauche etwas flexibleres. –

+0

@ ramires.cabral - vielleicht sagen Sie uns, was Sie brauchen? – Joe

+0

Ich möchte eine Eigenschaft ändern, jedes Mal, wenn ich ILog.Info aufrufen. Ich möchte Dateien, die auf bestimmten Ereignissen in meiner App basieren, umbenennen. Mit ThreadContext.Properties ist es möglich, aber ohne Aufruf von Configure. Und wenn ich es in mehreren Aufgaben ausführe funktioniert es nicht richtig. Sie sehen, ich habe keine Erfahrung mit log4net. Vielleicht ist das der falsche Ansatz. –

0

Log4Net unterstützt verschiedene Kontexte. GlobalContext, wie Sie gefunden haben, ist einer von ihnen. ThreadContext ist eine andere, und ich denke, besser geeignet in Ihrem Szenario ist:

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

Es gibt keine Notwendigkeit Configure zu nennen. Eigenschaften, die in ThreadContext festgelegt sind, sind für alle Aufrufe an den Logger aus dem aktuellen Thread verfügbar. Verweisen Sie auf das Objekt in der appender config in gewohnter Weise:

%property{PropertyName} 
+0

Ich denke, Sie meinten log4net.ThreadContext.Properties ["PropertyName"]. Wie auch immer, ich habe dein Beispiel versucht, aber ich musste XmlConfigurator aufrufen.Konfigurieren(); arbeiten. –

0

Basierend auf @ Joe Kommentar habe ich schreibe meine eigenen appender wie folgt:

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

Und es funktioniert, was nicht bedeutet ist richtig. Ich weiß nicht, ob es eine gute Sache ist, in der Appode-Methode zu überfressen, akquirieren Sperre und öffnen Sie die Datei jedes Mal, wenn ich etwas loggen. Irgendwelche Gedanken?

Verwandte Themen