2010-07-20 16 views
13

Sto usando NLog e voglio accedere a RichTextBox e File allo stesso tempo. E voglio configurare il logger a livello di codice, non con il file di configurazione xml.Come accedere a più destinazioni usando NLog?

Il seguente codice registra solo l'ultimo obiettivo (file in questo caso). Qualcuno può aiutare?

RichTextBoxTarget t1 = new RichTextBoxTarget(); 
t1.Layout = "${date} ${message}"; 
t1.ControlName = "rtb_log"; 
t1.FormName = "MainForm"; 
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(t1, LogLevel.Debug); 

FileTarget t2 = new FileTarget(); 
t2.Layout = "${date} ${level} ${message}"; 
t2.FileName = "${basedir}/Logs/today.log"; 
t2.KeepFileOpen = false; 
t2.Encoding = "iso-8859-2"; 
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(t2, LogLevel.Trace); 

Logger logger = LogManager.GetLogger("MyLogger"); 

risposta

9

Ok, ho capito. Avrei dovuto leggere il file di aiuto di più prima di pubblicare la domanda. Ma comunque, la risposta è quella di utilizzare SplitTarget come segue ...

RichTextBoxTarget t1 = new RichTextBoxTarget(); 
t1.Layout = "${date} ${message}"; 
t1.ControlName = "rtb_log"; 
t1.FormName = "MainForm"; 

FileTarget t2 = new FileTarget(); 
t2.Layout = "${date} ${level} ${message}"; 
t2.FileName = "${basedir}/Logs/today.log"; 
t2.KeepFileOpen = false; 
t2.Encoding = "iso-8859-2"; 

SplitTarget target = new SplitTarget(); 
target.Targets.Add(t1); 
target.Targets.Add(t2); 

NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug); 
Logger logger = LogManager.GetLogger("MyLogger"); 
+0

questo modo sovrascrive ancora le regole, che si limita a una regola. La risposta di Jason mi sembra più corretta. – GraemeF

7

SimpleConfigurator sovrascrive tutte le regole esistenti. Nel tuo esempio, hai avuto 2 chiamate, quindi il primo obiettivo è stato scartato.

Invece, si dovrebbe aggiungere manualmente una regola di destinazione e la registrazione e chiamare Reload():

LogManager.Configuration.AddTarget (t1); 
LogManager.Configuration.AddTarget (t2); 
LoggingRule r1 = new LoggingRule ("*", LogLevel.Debug, t1); 
LoggingRule r2 = new LoggingRule ("*", LogLevel.Trace, t2); 
LogManager.Configuration.LoggingRules.Add (r1); 
LogManager.Configuration.LoggingRules.Add (r2); 
LogManager.Configuration.Reload(); 
+0

'LogManager.Configuration.Reload()' non ha funzionato per me; non è stato registrato nulla Ciò che ha funzionato è stato dichiarare una nuova variabile 'var config = new LoggingConfiguration();', eseguire i passaggi sopra in 'config', quindi impostare' LogManager.Configuration = config; '. Il 'Reload' non funziona usando Nlog 2.0.0.0. –

Problemi correlati