达到 maxMessagesToLog 时如何旋转 WCF 日志?

问题描述 投票:0回答:2

我有 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 将停止记录日志。

wcf logging
2个回答
1
投票

我无法找到如何在达到 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亿条,我就会在日志文件中保留所有消息。


0
投票

另一种选择是使用符号链接。您可以在 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

然后,如果您的应用程序池每天回收一次,您每天都会创建一个新日志。

© www.soinside.com 2019 - 2024. All rights reserved.