log4netでformのtextBoxにlogを出力

log4net関連で、備忘録。

 

WindowsFormに貼り付けたTextBoxに、log4netを使ってLogを出力する。

 

パクリ元はStackOverflow

http://stackoverflow.com/questions/14114614/configuring-log4net-textboxappender-custom-appender-via-xml-file

 

何のため?

ユーザに今、何が起こっているのかを知らせる。

プログレスバーは、作業全体のどれくらいが終わっているかのみを表示するが、こちらは、今、何をしているかを表示できる。

 

 

log4netのconfig

>|xml

    <!-- 通常ログ:FormXXXのTextBox1に出力 -->
    <appender name="OutToTextBox1" type="appName.FormXXX,  appName">
      <formName value="FormXXX"/>
      <textBoxName value="TextBox1"/>
<!-- このあたりは同じ -->
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMax" value="Error" />
        <param name="LevelMin" value="Trace" />
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="&gt;&gt; - %message" />
      </layout>
    </appender>
 <root>
    <level value="INFO"/>
    <appender-refref="OutToTextBox1"/>
</root>

||<
 
 
TextBox1へ書き出すClassを作成(log4netのAppenderSkeltonを継承)
>|cs
public class TextBoxAppender : AppenderSkeleton
{
private TextBox _textBox;
public TextBox AppenderTextBox
{
get
{
return _textBox;
}
set
{
_textBox = value;
}
}
public string FormName { get; set; }
public string TextBoxName { get; set; }

private Control FindControlRecursive(Control root, string textBoxName)
{
if (root.Name == textBoxName) return root;
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, textBoxName);
if (t != null) return t;
}
return null;
}

protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
if (_textBox == null)
{
if (String.IsNullOrEmpty(FormName) ||
String.IsNullOrEmpty(TextBoxName))
return;

Form form = Application.OpenForms[FormName];
if (form == null)
return;

_textBox = (TextBox)FindControlRecursive(form, TextBoxName);
if (_textBox == null)
return;

form.FormClosing += (s, e) => _textBox = null;
}
_textBox.Invoke((MethodInvoker)delegate
{
_textBox.AppendText(loggingEvent.RenderedMessage + Environment.NewLine);
});
}
}

||<
 
 
実際に書き出すフォームで
 
>|cs
var textBoxAppender =newTextBoxAppender();
        textBoxAppender.TextBoxName="textBox1";
        textBoxAppender.FormName="FormXXX";
        textBoxAppender.Threshold= log4net.Core.Level.All;var consoleAppender =new log4net.Appender.ConsoleAppender{Layout=new log4net.Layout.SimpleLayout()};varlist=newAppenderSkeleton[]{ textBoxAppender, consoleAppender };
        log4net.Config.BasicConfigurator.Configure(list);

||<

以上でファイルに出力するLogをtextBoxにも出力出来た。