2014-10-27 57 views
0

我在嘗試理解log4net formName和textBoxName元素的配置時遇到困難。我一直在關注前面一個問題here登錄到文本框的log4net配置

具體我試圖創建一個包含一個文本框作爲記錄器

namespace foo { 
    public partial class LoggingControl : UserControl, IAppender { 
     private ILog _logger = LogManager.GetLogger(typeof(LoggingControl)); 

     public LoggingControl() { 
      InitializeComponent(); 
     } 

     public ILog Logger { 
      get { 
       return _logger; 
      } 
     } 

     public string FormName { 
      get; 
      set; 
     } 

     public string TextBoxName { 
      get; 
      set; 
     } 

     public void DoAppend(log4net.Core.LoggingEvent loggingEvent) { 
      textBox.AppendText(loggingEvent.MessageObject.ToString() + Environment.NewLine); 
     } 

     public void Close() { 
     } 
    } 
} 
在我的配置

我有

<log4net> 
    <appender name="Logger" type="foo.LoggingControl"> 
     <formName value="MainForm"/> --- ###01 
     <textBoxName value="textBox"/> --- ###02 
     <root> 
      <level value="DEBUG"> 
       <appender-ref ref="textbox"> 
       </appender-ref> 
      </level> 
     </root> 
    </appender> 
</log4net> 
    一個自定義用戶控件
  1. 被設置爲包含自定義控件 的表單的名稱,其中包含日誌文本框
  2. 設置爲自定義控件內部的文本框的名稱。

這是行不通的,我錯過了什麼?

+0

請嘗試使用AppenderSkeleton並在config中使formName和textBoxName區分大小寫。希望這對你有所幫助。 – dotnetstep 2014-10-27 03:25:18

+0

嗨Anik,我沒有看到一個AppenderSkeleton,使用最新的1.2.13-bin-newkey。 – mfc 2014-10-27 03:32:17

回答

2

當使用SkeletonAppender你只需要找到一個方法來找到文本框:

public class TextBoxAppender : AppenderSkeleton 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     TextBox tb = FindMyTextBox(); 
     tb.Text += RenderLoggingEvent(loggingEvent); 
    } 

    private TextBox FindMyTextBox(){ 
     //Get the textbox from your program and return it for logging 
    } 
} 

的其他選擇可以是公開的靜態記錄的文字與屬性更改事件,並將其綁定到你的文本框的文本。

0

對於threadsafe,您應該使用textBox.BeginInvoke而不是textBox.Invoke