Просто хотел предоставить мое полное решение для справки.Пара важных элементов FixFlags позволяет вам захватить поток, который фактически выполняет регистрацию.Коллекция блокировок находится в ReactiveExtensions.Суть здесь в том, что ваш перенаправляющий обработчик обрабатывает асинхронные операции, а затем просто пересылает LoggingEvent стандартному приложению Log4Net, что позволяет Log4Net делать все то, что у него хорошо получается.Не нужно заново изобретать колесо.
/// <summary>
/// Provides an extension for the log4net libraries to provide ansynchronous logging capabilities to the log4net architecture
/// </summary>
public class AsyncLogFileAppender : log4net.Appender.ForwardingAppender
{
private static int _asyncLogFileAppenderCount = 0;
private readonly Thread _loggingThread;
private readonly BlockingCollection<log4net.Core.LoggingEvent> _logEvents = new BlockingCollection<log4net.Core.LoggingEvent>();
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
loggingEvent.Fix = FixFlags.ThreadName;
_logEvents.Add(loggingEvent);
}
public AsyncLogFileAppender()
{
_loggingThread = new Thread(LogThreadMethod) { IsBackground = true, Name = "AsyncLogFileAppender-" + Interlocked.Increment(ref _asyncLogFileAppenderCount), };
_loggingThread.Start();
}
private void LogThreadMethod()
{
while (true)
{
LoggingEvent le = _logEvents.Take();
foreach (var appender in Appenders)
{
appender.DoAppend(le);
}
}
}
}
Затем в файле log4net.xml вы настраиваете таким образом добавляющие
<!-- Standard form output target location and form -->
<appender name="StandardAppender" type="TSUIC.Logging.AsyncLogFileAppender">
<appender-ref ref="StandardAppenderSync" />
</appender>
<appender name="StandardAppenderSync" type="log4net.Appender.RollingFileAppender">
<!-- The standard pattern layout to use -->
<file value="log\Log_" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="5GB" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.txt'" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
Обновление:
Если вы хотите использовать контекст в log4net как "log4net.ThreadContext.Properties["CustomColumn"]
"
Тогда вам нужно обновить приведенный выше код, например
loggingEvent.Fix = FixFlags.All;