Статический log4net с буферизацией приложения
Я хотел бы использовать статический буфер для моего приложения. Я нашел способ сделать это, но это немного взломать. Как показано ниже, он имеет буфер 3. Когда этот буфер заполняется, вызывается метод SendBuffer(LoggingEvent[] events). Это должно быть широкое применение. Если какой-либо регистратор получает сообщение, он должен переслать его этому статическому буферизованному приложению, которое будет записывать 4 сообщения одновременно в БД, когда оно будет у них.
Моя реализация (хак) - это новый 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)
{
}
Config:
<log4net>
<appender name="ForwardingDbBufferedAppender" type="Blah.ForwardingDbBufferedAppender, Blah">
<bufferSize value="3" />
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ForwardingDbBufferedAppender" />
</root>
</log4net>
Есть ли способ лучше? Прямо сейчас это полный взлом, потому что я пересылаю только BufferSize. Что, если я добавлю фильтр диапазона или переключу потери с истинным значением и добавлю оценщик и т. Д. Прямо сейчас мне придется перенаправить все возможности конфигурации в статический DbBufferedAppender.