2011-07-07 105 views
5

我閱讀了以下文章,但都沒有幫助像Winforms一樣從NLog將日誌打印到RichTextBox控件目標上。如何將RichTextBox用作WPF應用程序中的NLog目標?

How can I use NLog's RichTextBox Target in WPF application?

WPF: Binding RichTextBox to Logger Output

我也瀏覽了官方論壇,但沒有成功(除了建議閱讀上面的兩個職位)。

的想法是將目標添加爲:

<target xsi:type="RichTextBox" name="console" 
    layout="${longdate:useUTC=true}|${level:uppercase=true}|${logger}::${message}" 
    autoScroll="true" 
    maxLines="1000000" 
    controlName="rtbConsole" 
    formName="MyWPFWindowName" 
    useDefaultRowColoringRules="true"> 
</target> 

而且隨着MyWPFWindowName姓名WPF窗口內,添加與rtbConsole RichTextBox控件。即使我在加載完winow之後以編程方式創建目標,它也不會使用現有的rtbConsole,而是創建一個新窗體。

所以,你的幫助表示讚賞!

+0

到目前爲止你嘗試了什麼,會發生什麼?請顯示一些代碼,而不是簡單地說不起作用。 –

+0

登錄RichTextBox時遇到的具體問題是什麼? 「效率不高」很模糊。你期望發生什麼? –

+0

請參閱我上面的編輯。如果您使用NLog和WPF,則複製問題非常簡單。 –

回答

7

我創建了一個自定義的NLog目標並將其鏈接到一個文本框。

public class NlogMemoryTarget : Target 
{ 
    public Action<string> Log = delegate { }; 

    public NlogMemoryTarget (string name, LogLevel level) 
    { 
     LogManager.Configuration.AddTarget (name, this); 

     LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", level, this));//This will ensure that exsiting rules are not overwritten 
     LogManager.Configuration.Reload(); //This is important statement to reload all applied settings 

     //SimpleConfigurator.ConfigureForTargetLogging (this, level); //use this if you are intending to use only NlogMemoryTarget rule 
    } 

    protected override void Write (AsyncLogEventInfo[] logEvents) 
    { 
     foreach (var logEvent in logEvents) { 
      Write (logEvent); 
     } 
    } 

    protected override void Write (AsyncLogEventInfo logEvent) 
    { 
     Write (logEvent.LogEvent); 
    } 

    protected override void Write (LogEventInfo logEvent) 
    { 
     Log (logEvent.FormattedMessage); 
    } 
} 


public partial class MainWindow 
{ 
    private NlogMemoryTarget _Target; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     this.Loaded += (s, e) => { 
      _Target = new NlogMemoryTarget ("text box output", LogLevel.Trace); 
      _Target.Log += log => LogText (log); 
     }; 
    } 

    private void LogText (string message) 
    { 
     this.Dispatcher.Invoke ((Action) delegate() { 
      this.MessageView.AppendText (message + "\n"); 
      this.MessageView.ScrollToEnd(); 
     }); 
    } 
} 
+0

什麼是_L?有錯誤。我相信它不是必需的。 –

+0

你怎麼實際添加日誌? –

+1

@publicENEMY修復。在這種情況下,日誌由代表發送到文本框。 – mafu

相關問題