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

Vb.net Log4Net为具有多个文件日志记录的多个请求设置上下文?,vb.net,multithreading,wcf,log4net,Vb.net,Multithreading,Wcf,Log4net,我们正在尝试使用请求到WCF服务的log4net日志进程。为此,我们的目标是根据请求的某些参数登录不同的文件。为此,我们使用了log4net的上下文属性,在对服务的每次调用中设置它的上下文,但是,由于可能存在并发性问题,我们不能使用“GlobalContext” 认为wcf每次调用使用一个线程(这似乎是错误的想法),我们在收到请求时设置ThreadContext属性,例如: GlobalContext.Properties("fulldate") = Now.ToString("yyyyMMdd

我们正在尝试使用请求到WCF服务的log4net日志进程。为此,我们的目标是根据请求的某些参数登录不同的文件。为此,我们使用了log4net的上下文属性,在对服务的每次调用中设置它的上下文,但是,由于可能存在并发性问题,我们不能使用“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如何管理线程。我不想将服务设置为每个请求都实例化。你能给我一个WCF如何管理线程的链接或文档吗?我还没找到。有可能完成我想做的事情吗?也就是说,将一个中心的所有请求记录在该中心的日志文件中


谢谢。

那不行,而且与WCF的线程模型无关

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


要实现这一点,您需要每个日志文件、每个“中心”有一个文件附加器。如果事先知道中心,您可以在配置中设置它们,否则很容易就无法工作,而且与WCF的线程模型无关

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


要实现这一点,您需要每个日志文件、每个“中心”有一个文件附加器。如果事先知道这些中心,您可以在配置中设置它们,否则很容易

谢谢!很高兴知道,这不是因为线程,会更复杂。是的,这些中心是事先知道的,所以这就足够了,我这周会试试。试过这个,和过滤器结合起来或多或少效果很好。但是有一个问题:如果过滤器不允许它写入文件,是否可以阻止记录器创建文件?如果一天没有一个中心的请求,我不希望有一千个空文件。记录器在配置文件时创建该文件,因此您必须将配置从配置移到代码中,然后按需创建该文件。谢谢!很高兴知道,这不是因为线程,会更复杂。是的,这些中心是事先知道的,所以这就足够了,我这周会试试。试过这个,和过滤器结合起来或多或少效果很好。但是有一个问题:如果过滤器不允许它写入文件,是否可以阻止记录器创建文件?如果一天内一个中心没有一个请求,我不希望有一千个空文件。记录器在配置文件时创建该文件,因此您必须将配置从配置移到代码中,然后按需创建该文件。