log4netでformのtextBoxにlogを出力
log4net関連で、備忘録。
WindowsFormに貼り付けたTextBoxに、log4netを使ってLogを出力する。
パクリ元はStackOverflow
何のため?
ユーザに今、何が起こっているのかを知らせる。
プログレスバーは、作業全体のどれくらいが終わっているかのみを表示するが、こちらは、今、何をしているかを表示できる。
log4netのconfig
>|xml
<!-- 通常ログ:FormXXXのTextBox1に出力 -->
<appender name="OutToTextBox1" type="appName.FormXXX, appName">
<formName value="FormXXX"/>
<textBoxName value="TextBox1"/>
<!-- このあたりは同じ -->
<param name="LevelMin" value="Trace" />
</filter>
<conversionPattern value=">> - %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にも出力出来た。