具有多个文件日志记录的多个请求的 Log4Net 设置上下文?

Log4Net setting contexts for multiple requests with multiple file logging?

我们正在尝试使用向 WCF 服务请求的 log4net 日志进程。为此,我们的目标是根据请求的某些参数登录不同的文件。为此,我们使用了 log4net 的 Context 属性,在每次调用服务时设置它的上下文,但是,由于可能存在并发问题,我们不能使用 "GlobalContext".

想(好像想错了)wcf每次调用一个线程,我们在收到请求的时候设置ThreadContext属性,比如这样:

GlobalContext.Properties("fulldate") = Now.ToString("yyyyMMdd")
GlobalContext.Properties("date") = Now.ToString("yyyyMM")

ThreadContext.Properties("center") = center //it comes with the request header

XmlConfigurator.Configure()

appender 在配置文件中定义如下:

<appender name="IntAppender" type="log4net.Appender.FileAppender"> 
<file type="log4net.Util.PatternString" value="c:\Logs\%property{center}\%property{date}\%property{fulldate}\theLog.log" /> 
<datePattern value=".yyyyMMdd.'log'" /> 
<appendToFile value="true" /> 
<layout type="log4net.Layout.PatternLayout"> 
  <conversionPattern value="%date [%thread] %-5level - [%ndc] %message%newline" /> 
</layout> 

但有时,应该在一个中心的日志中的日志在另一个中心的日志中,问题似乎出在 WCF 如何管理线程上。我不想将服务设置为按请求实例化。你能给我指点一个 link 或 WCF 如何管理线程的文档吗?我找不到一个。是否有可能完成我想做的事情?即,将一个中心的所有请求记录在该中心的日志文件中。

谢谢。

那是行不通的,与WCF的线程模型无关。

Log4net 在记录器之间共享您定义的单个附加程序,从而在线程之间共享。 当一个线程更改文件追加器上的文件值时,这适用于所有线程因此这是一种竞争条件,可以查看错误最终出现在哪个日志中!

要实现这一点,您需要根据 "center" 每个日志文件有一个文件附加程序。如果事先知道这些中心,您可以在配置中设置它们,否则很容易 set them up programatically