我喜欢我的应用程序的静态缓冲appender。我找到了一种方法来实现这一目标,但这有点像黑客攻击。如下所示,它具有3的缓冲区。当缓冲区填充时,将调用SendBuffer(LoggingEvent []事件)方法。这应该是适用范围广泛的。如果任何记录器收到消息,它应该将它转发给这个静态缓冲的appender,它会在拥有它们时一次写出4条消息。
我的实现(hack)是一个新的ForwardingDbBufferedAppender(BufferingAppenderSkeleton),它将消息传递给静态DbBufferedAppender(也是新的BufferingAppenderSkeleton),如下所示:
public class ForwardingDbBufferedAppender : log4net.Appender.BufferingAppenderSkeleton
{
private static readonly object m_lockObj = new object();
private static DbBufferedAppender m_dbBufferedAppender;
public override void ActivateOptions()
{
lock (m_lockObj)
{
if (m_dbBufferedAppender == null)
{
m_dbBufferedAppender = new DbBufferedAppender(this.BufferSize);
}
}
base.ActivateOptions();
}
protected override void Append(LoggingEvent loggingEvent)
{
m_dbBufferedAppender.DoAppend(loggingEvent);
}
protected override void SendBuffer(LoggingEvent[] events)
{
}
配置:
<log4net>
<appender name="ForwardingDbBufferedAppender" type="Blah.ForwardingDbBufferedAppender, Blah">
<bufferSize value="3" />
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ForwardingDbBufferedAppender" />
</root>
</log4net>
有更好的方法吗?现在这是一个完全黑客攻击,因为我只转发BufferSize。如果我添加范围过滤器或将有损开关添加到true并添加评估器等,那么现在我必须将所有配置可能性转发给静态DbBufferedAppender。