2010-08-18 9 views
23

Ich schreibe ein kleines Dateikonvertierungsprogramm. Dateien werden automatisch konvertiert, wenn sie in ein Verzeichnis fallen.Hinzufügen/Entfernen von Protokolldateien zur Laufzeit in NLog

Ich benutze NLog für die Protokollierung. Neben einer zentralen Protokolldatei, die mit NLog.conf konfiguriert ist (und die alle generierten Nachrichten empfängt), möchte ich für jede Eingabedatei eine zusätzliche Protokolldatei erstellen, die einen ähnlichen Namen hat und alle während der Umwandlungsprozess.

Leider kann ich nicht herausfinden, wie man während der Laufzeit ein neues Dateiziel zusammen mit der entsprechenden Regel richtig hinzufügt. Ich möchte, dass alle Logger Objekte während des Konvertierungsprozesses in die neue Protokolldatei schreiben.

Ich habe versucht, so etwas wie

var logfile = new NLog.Targets.FileTarget(); 
logfile.FileName = fileName + ".log"; 
logfile.KeepFileOpen = true; 
logfile.Initialize(); 
var rule = new NLog.Config.LoggingRule("*", logfile); 
NLog.LogManager.Configuration.LoggingRules.Add(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 
// 
// Proceed with converting file 
// 
logfile.Flush(); 
NLog.LogManager.Configuration.LoggingRules.Remove(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 

Aber keine Protokolldatei erstellt wurde.

Was habe ich falsch gemacht? Irgendeine Idee?

Antwort

47

Der zweite Beitrag auf diesen Thread führte mich zu der Lösung: http://nlog-project.org/forum.html#nabble-td1685349

Sie haben die aktuelle NLog Konfiguration zu erhalten, Änderungen an diesem LoggingConfiguration Objekt, es dann zu LogManager.Configuration zuweisen zurück.

Dies ist der Code, den ich verwendet:

LoggingConfiguration config = LogManager.Configuration; 

var logFile = new FileTarget(); 
config.AddTarget("file", logFile); 

logFile.FileName = fileName + ".log"; 
logFile.Layout = "${date} | ${message}"; 

var rule = new LoggingRule("*", LogLevel.Info, logFile); 
config.LoggingRules.Add(rule); 

LogManager.Configuration = config; 

logger.Info("File converted!"); 
+9

Die Linie mit der Neuzuordnung ist sehr wichtig: LogManager.Configuration = config; – habakuk

+2

** Die Zeile mit der Neuzuordnung Um zu klären ist sehr wichtig: LogManager.Configuration = config; ** Dies wegen der Art und Weise wahr ist NLog die Getter und Setter für die Konfiguration Eigenschaft geschrieben hat. Es ist nicht schön, aber es muss erneut mit einem geänderten Objekt eingestellt werden; Sie können die Eigenschaft nicht direkt ändern. – zshift

+0

Ich musste die Logger-Variable am Ende neu zuweisen, um dies zum Laufen zu bringen: logger = LogManager.GetCurrentClassLogger(); – Henry