我有 WCF 服务并想要启用日志记录。正如 Microsoft 文档配置消息日志记录中所述,我在 Web.config 中添加了以下内容:
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\messages.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>
当最后一个日志中的消息数达到 maxMessagesToLog=3000 时,如何轮换日志,例如写入 messages1.svclog,然后写入 messages2.svclog 等?
我阅读了文章 A Rolling XmlWriterTraceListener,但这会在达到特定文件大小时轮换日志文件。但是,当消息数量达到 maxMessagesToLog 时,WCF 将停止记录日志。
我无法找到如何在达到 maxMessagesToLog 之前轮换日志文件。
我决定每天午夜轮换日志文件。将 maxMessagesToLog 设置为最大整数 = 2147483647,一天内的消息数永远不会超过该值。 我使用了自定义跟踪侦听器,如 WCF 论坛中所述。
public class CustomTraceListener : XmlWriterTraceListener
{
public CustomTraceListener(string fileName)
: base(string.Format(fileName,
string.Format("{0}{1}{2}", DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year)))
{
}
}
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="traceListener"
type="MyService.CustomTraceListener, MyService"
initializeData= "c:\wcflogs\messages_{0}.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
我使用回收特定时间 = 00:00:00 创建了我的应用程序池
appcmd add apppool /name:MyApppool/enable32BitAppOnWin64:true /+recycling.periodicRestart.schedule.[value='00:00:00']
应用程序池的高级设置使用此命令如下:
因此,该进程每天午夜都会被回收,并且消息计数器从0开始。只要我每天的消息少于20亿条,我就会在日志文件中保留所有消息。
另一种选择是使用符号链接。您可以在 IIS 运行时删除和重置符号链接。然后当它回收或重新启动时,将创建一个新文件。
例如,您可以使用如下命令创建符号链接:
mklink server_tracelog.svclog server_tracelog_1.svclog
然后在 web.config 中设置此文件“server_tracelog.svclog”,但这将是它写入“server_tracelog_1.svclog”的真实文件
然后也许使用计划任务,您可以运行一个具有如下内容的批处理文件:
REM set day of week as %DAYOFWEEK%
for /f %%a in ('wmic path win32_localtime get DAYOFWEEK /format:list ^| findstr "="') do (set %%a)
del server_tracelog.svclog
del server_tracelog_dayofweek_%DAYOFWEEK%.svclog
mklink server_tracelog.svclog server_tracelog_dayofweek_%DAYOFWEEK%.svclog
然后,如果您的应用程序池每天回收一次,您每天都会创建一个新日志。