3

Actionを使用して並行して実行したい一連のがありParallel.Invokeます。しかし、それぞれについてAction、log4net によって作成された個別のログ ファイルが必要です。私のlog4net構成ファイルでは、これを追加しました:

<file type="log4net.Util.PatternString" value="3S2M3_%property{UniqueIdentifier}.log" />

実行するアクションが 1 つしかない場合、これは正常に機能します。ログ ファイルには正しいファイル名が含まれています。

ただし、実行するエントリが複数ある場合はAction、すべてのログ エントリが同じログ ファイルになります。

を作成するためのコードActionは次のとおりです。

    Dim lstActions(4) As Action
    Dim iCount As Integer = 0

    For iCount = 0 To 4
        Dim sUniqueIdentifier As String = iCount.ToString("D4")

        Dim aOrderTask As Action = Sub()
           log4net.LogicalThreadContext.Properties("UniqueIdentifier") = sUniqueIdentifier

       ' Some process that takes some time to complete
                                   End Sub
        lstActions(iCount) = aOrderTask
    Next

    Parallel.Invoke(lstActions)

作成されるログ ファイルは、プロパティに割り当てられた値の 1 つを使用していUniqueIdentifierます。この値がどのように選択されるかわかりません。常に最初または最後であるとは限りません。上記の例では、ファイルのみ3S2M3_0004.logが作成され、すべてのログ エントリが含まれています。

LogicalThreadContext と ThreadContext の両方を試しましたが、違いはありません。

4

1 に答える 1

2

log4net は構成をロードするときにログ ファイル名を割り当てるため、実行時にカスタム名を設定する必要があります。

もう 1 つの注意点は、log4net がロガー間でアペンダーを共有することです。そのため、異なるファイルに同時にログを記録するには、プログラムでアペンダーを割り当てる必要があり、プロセスの外部ではなくプロセス内でそれを行う必要があります。

(本当にコードでアペンダー プロパティを設定したくない場合は、構成で定義し、階層から取得して、タスクごとに複製することができます。どちらの方法でも、タスクの各インスタンスには独自のロガーが必要であり、一意のアペンダー)

したがって、次のような構成が与えられます。

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="false">
   <root>
     <level value="DEBUG" />
   </root>

   <!-- more config -->

   <logger name="EmptyLogger" additivity="false">
   </logger>
   <!-- additivity="false" specifies not to load any appenders defined on the root logger -->
</log4net>

次に、次のようなコードを作成できます。

Private Shared Sub ProcessThatTakesSomeTimeToComplete()
    Dim sUniqueIdentifier As New String(Guid.NewGuid().ToString("N").Take(4).ToArray())

    ' Get a uniquely-named empty logger containing no appenders
    Dim log = LogManager.GetLogger("EmptyLogger." & sUniqueIdentifier)

    ' Create an appender manually, setting the path as required
    Dim sPath As New String(Path.Combine("c:\temp", sUniqueIdentifier & ".log"))

    Dim appender = New FileAppender() With { _
         .Layout = New PatternLayout("%date [%thread] %message"), _
         .File = sPath, _
         .AppendToFile = True _
    }

    appender.ActivateOptions()

    ' Add the appender to the logger
    DirectCast(log.Logger, Logger).AddAppender(appender)

    ' And off we go.
    log.Debug("Hello from thread " + Thread.CurrentThread.ManagedThreadId)

    Thread.Sleep(100)
End Sub

輸入品:

Imports System.IO
Imports System.Threading
Imports log4net
Imports log4net.Appender
Imports log4net.Layout
Imports log4net.Repository.Hierarchy
于 2015-12-17T17:33:24.003 に答える