Log4Net MemoryAppender 似乎错过了高速日志事件
本文关键字:高速 日志 事件 错过了 MemoryAppender Log4Net | 更新日期: 2023-09-27 18:36:39
我正在使用log4net MemoryAppender在表单文本框上显示我的log4net输出。 我的配置文件的相关部分是:
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level %date %message%newline" />
</layout>
</appender>
更新窗体的代码由计时器触发,如下所示:
var events = _memoryAppender.GetEvents();
foreach (var loggingEvent in events)
{
textBoxOutput.Text += loggingEvent.Level + " " + loggingEvent.MessageObject + Environment.NewLine;
}
_memoryAppender.Clear();
它正在工作,但是当我的应用程序在短时间内记录大量消息时,我似乎看不到它们。 有人知道发生了什么吗?
作为解决方法,我正在使用电锯和UDP附加器:
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="ERROR"/>
</filter>
<param name="RemoteAddress" value="127.0.0.1" />
<param name="RemotePort" value="8080" />
<layout type="log4net.Layout.XmlLayoutSchemaLog4j, log4net" />
</appender>
不过,我更喜欢自己的UI,所以我仍在寻找答案。
我假设会发生以下情况: 在文本框中写入日志消息时,将记录新消息。清除追加器中的消息时,也会删除这些新消息,这些消息不会写入文本框。
您可以通过在开始将消息写入文本框之前清除追加器来改善这种情况,但我认为您应该创建自己的内存追加器并提供一种返回消息并一步清除数组的方法。像这样:
public class MyMemoryAppender : MemoryAppender
{
public LoggingEvent[] GetAndClearEvents()
{
lock (m_eventList.SyncRoot)
{
var events = (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
m_eventsList.Clear();
return events;
}
}
}