Form
withTextBox
をアペンダーとして使用しようとしていますlog4net
が、TextBox
単にテキストを追加しないでください。なるほど、そのAppendText
メソッドは (UI スレッドから) 呼び出され、プロパティText
は変更されますが、追加された値が消えるだけで、Text
プロパティはまだ空です。
問題があるかどうかはわかりませんlog4net
が、問題はログでのみ発生します。
アプリケーションの起動とフォーム (InvokeIfRequired
ここからの非常に一般的な拡張機能です: InvokeRequired コード パターンの自動化):
public partial class FormMain : Form, IAppender
{
readonly ILog log;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
XmlConfigurator.Configure();
Application.Run(new FormMain());
}
public FormMain()
{
log = LogManager.GetLogger(typeof(FormMain));
InitializeComponent();
}
public void DoAppend(LoggingEvent le)
{
tbLog.AppendText("This msg is NOT shown");
tbLog.InvokeIfRequired(() =>
{
// NOT SHOWN
tbLog.AppendText(string.Format("{0:yyyyMMdd HH:mm:ss.fff}> [{1}] [{2}] {3}", le.TimeStamp, le.LoggerName, le.Level, le.MessageObject));
});
}
private void bTestLog_Click(object sender, EventArgs e)
{
tbLog.AppendText("This msg is shown");
log.Debug("Test logs");
}
}
App.config:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
<file value="mylogfile.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<appender name="FormMain" type="Client.FormMain,Client" />
<root>
<level value="DEBUG"/>
<appender-ref ref="FormMain"/>
</root>
</log4net>
</configuration>
AssemblyInfo.cs:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
ボタンをクリックすると、「このbTestLog
メッセージが表示されます」というメッセージが 1 つだけ表示されます。tbLog
UPDText
のプロパティを
監視tbLog
したところ、非常に奇妙であることがわかりました。最初に追加した後、予想どおり、「このメッセージが表示されます」です。しかし、プログラムがDoAppend
メソッドに入ると、それは空です。さらに追加すると、期待どおりに変更されますが、元に戻ると、bTestLog_Click
再び「このメッセージが表示されます」です!