2010-08-18 3 views
23

Sto scrivendo una piccola utilità di conversione file. I file vengono convertiti automaticamente quando vengono rilasciati in una directory.Aggiungi/rimuovi file di log durante il runtime in NLog

Sto utilizzando NLog per la registrazione. Oltre a un file di registro centrale che viene configurato utilizzando NLog.conf (e che riceve tutti i messaggi generati), vorrei creare un file di registro aggiuntivo per ogni file di input, con un nome simile e contenente tutti i messaggi di registro scritti durante il processo di conversione.

Purtroppo mi sembra di non essere in grado di scoprire come aggiungere correttamente un nuovo target di file insieme alla regola appropriata durante il runtime. Voglio che tutti gli oggetti Logger scrivano nel nuovo file di registro durante il processo di conversione.

ho provato qualcosa di simile

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

Ma nessun file di log è stato creato.

Cosa ho sbagliato? Qualche idea?

risposta

47

Il secondo post su questo thread mi ha portato alla soluzione: http://nlog-project.org/forum.html#nabble-td1685349

Dovete ottenere la configurazione NLog corrente, apportare modifiche a questo oggetto LoggingConfiguration, quindi assegnare di nuovo a LogManager.Configuration.

Questo è il codice che ho usato:

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

La linea con la riassegnazione è molto importante: LogManager.Configuration = config; – habakuk

+2

Per chiarire ** La riga con la riassegnazione è molto importante: LogManager.Configuration = config; ** Ciò è vero a causa del modo in cui NLog ha scritto i getter e i setter per la proprietà Configuration. Non è carino, ma deve essere impostato di nuovo con un oggetto modificato; non è possibile modificare direttamente la proprietà. – zshift

+0

Ho dovuto riassegnare la variabile del logger alla fine per farlo funzionare: logger = LogManager.GetCurrentClassLogger(); – Henry