log4net の非同期ラッパーを作成するにはどうすればよいですか?

参照用に完全なソリューションを提供したかっただけです。いくつかの重要な項目である 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.ThreadContext.Properties["CustomColumn"] のような log4net でコンテキストを使用する場合 "

次に、上記のコードを

のように更新する必要があります
loggingEvent.Fix = FixFlags.All;

log4net の Web サイトにアクセスすると、いくつかの例が見つかります。そのうちの少なくとも 1 つは非同期アペンダーです。

http://logging.apache.org/log4net/release/example-apps.html

私はこれらの例のいずれも使用していないので、いずれかの方法で保証することはできません.

コード リポジトリの log4net Examples エリアから実際の非同期アペンダーへのリンクを次に示します。

http://svn.apache.org/viewvc/logging/log4net/trunk/examples/net/2.0/Appenders/SampleAppendersApp/cs/src/Appender/AsyncAppender.cs?view=markup

簡単に調べてみたところ、1 つ以上の「従来の」アペンダーのラッパーとして機能しているようです。各ログ要求 (1 つ以上の LoggingEvent オブジェクトを含む) で、ThreadPool スレッドを使用して LoggingEvent をラップされた Appender のリストに転送します。


これが私のやり方です:

Task.Factory.StartNew(() => log.Info("My Info"));

そうすれば、log4net は別のスレッドで非同期的にロギングを実行します...

ところで、Task クラスは System.Threading.Tasks にあります 名前空間。