我们正在尝试使用请求到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 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如何管理线程的链接或文档吗?我没能找到一个。有可能完成我想做的事吗?也就是说,在该中心的日志文件中记录一个中心的所有请求。
谢谢。
发布于 2016-10-06 09:09:09
这是行不通的,这与WCF的线程模型无关。
Log4net在记录器之间,从而在线程之间共享您定义的单个附录。当一个线程更改文件附录上的文件值时,这将适用于所有线程,因此查看错误实际上在哪个日志中结束是一个争用条件!
要做到这一点,您需要每个日志文件,每个“中心”有一个文件附录。如果预先知道这些中心,您可以在配置中设置它们,否则就很容易实现按程序设置它们
https://stackoverflow.com/questions/39878264
复制相似问题