gpt4 book ai didi

vb.net - 如何让 log4net 为 Parallel.Invoke 中的每个操作创建单独的日志文件?

转载 作者:行者123 更新时间:2023-12-02 01:34:10 26 4
gpt4 key购买 nike

我有一系列 Action,我想使用 Parallel.Invoke 并行执行。但对于每个 Action 我希望有一个由 log4net 创建的单独的日志文件。在我的 log4net 配置文件中,我添加了以下内容:

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

如果只有一个操作可以执行此操作正常:日志文件具有正确的文件名。

但是,如果要执行多个 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)

创建的日志文件使用分配给 UniqueIdentifier 属性的值之一。我无法弄清楚如何选择这个值:它并不总是第一个或最后一个。在上面的示例中,仅创建了文件 3S2M3_0004.log 并且它包含所有日志条目。

我已经尝试了 LogicalThreadContext 和 ThreadContext,但没有什么区别。

最佳答案

log4net 在加载配置时分配日志文件名称,因此您需要在运行时设置自定义名称。

另一件事需要注意的是 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

关于vb.net - 如何让 log4net 为 Parallel.Invoke 中的每个操作创建单独的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34330416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com