2010-07-20 59 views
13

我正在使用NLog,並且想要同時登錄到RichTextBox和File。我想以編程方式配置Logger,而不是使用xml配置文件。如何使用NLog登錄到多個目標?

以下代碼只記錄到最後一個目標(本例中爲File)。任何人都可以幫忙嗎?

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

回答

9

好吧,我明白了。在發佈問題之前,我應該更多地閱讀幫助文件。但不管怎麼說,答案是使用SplitTarget如下...

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

這種方式仍然覆蓋規則,限制你到一個規則。 Jason的回答對我來說似乎更加正確。 – GraemeF 2015-04-21 15:41:37

7

SimpleConfigurator覆蓋所有現有的規則。在你的例子中,你有2個電話,所以第一個目標被丟棄。

相反,你應該手動添加的目標和記錄的規則,並調用刷新():

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()'不適合我;沒有記錄。做了什麼工作就是聲明一個新變量'var config = new LoggingConfiguration();',在'config'上執行上述步驟,然後設置'LogManager.Configuration = config;'。使用Nlog 2.0.0.0'Reload'不起作用。 – 2016-08-28 19:10:07