我正在尝试使用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");
}
}
应用程序配置:
<?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>
装配信息.cs:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
单击按钮后,bTestLog
仅显示一条消息tbLog
:“显示此消息”
UPD
我已经监视了它Text
的财产,tbLog
发现它很奇怪。在第一次附加之后,正如预期的那样,它是“显示此消息”。但是当程序进入DoAppend
方法时,它是空的。进一步的附加按预期更改它,但是当回到bTestLog_Click
它时再次显示“此消息显示”!