我有一个接收 WCF 请求的 Windows 服务进程。对于每个请求,它都会创建执行某些工作的新线程。我想为主机进程创建一个日志文件,并为每个线程实例单独的唯一日志文件。例如,我希望日志文件类似于“%date{yyyyMMdd}_%property{UniqueId}.log”。这是我到目前为止所拥有的。
<appender name="ThreadAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="c:\Logs\%date{yyyyMMdd}\%date{HHmmss}_%property{FileID}.log"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="10MB"/>
<rollingStyle value="Size"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<header value="[Header]
"/>
<footer value="[Footer]
"/>
<conversionPattern value="[%date] [%thread] [%-5level] %logger - %message%newline"/>
</layout>
</appender>
<appender name="ServiceAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\Service.log"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="10MB"/>
<rollingStyle value="Size"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<header value="[Header]
"/>
<footer value="[Footer]
"/>
<conversionPattern value="[%date] [%thread] [%-5level] %logger - %message%newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="ThreadAppender"/>
</root>
<logger name="ServiceLogger" additivity="false">
<level value="INFO"/>
<appender-ref ref="ServiceAppender"/>
</logger>
然后,在我的线程中,我使用LogicalContext.Properties["FileID"] = <some id>
. 我[assembly: log4net.Config.XmlConfigurator(Watch = true)]
在 assemblyinfo.cs 文件中也有一行。
一切几乎都有效:)。一个问题是,当我启动 Windows 服务时,它会自动创建新的 %date{HHmmss}_(null).log 文件。我需要配置什么才能使 log4net 不会创建这个虚拟文件?另外,是否需要为 ServiceAppender 和 ThreadAppender 指定文件锁定?