.Net WCF Service Trace Log с управлением файлами журналов (Rolling)

У меня есть некоторые службы .Net WCF, для этих служб я настроил файл app.config для регистрации сообщений, отправленных и полученных, в файле .svclog, который доступен для чтения & quot; Service Trace Viewer Tool & quot; (SvcTraceViewer.exe). Этот инструмент хорошо отображает файлы журналов, показывая обработанные SOAP-сообщения.

Мне нужно использовать прослушиватель System.Diagnostics.XmlWriterTraceListener, чтобы правильно отформатировать файл .svclog, чтобы его можно было обработать с помощью средства просмотра трассировки служб.

У меня проблема в том, что файл .svclog становится слишком большим & amp; Service Trace Viewer Tool становится непригодным для использования из-за медленного времени отклика.

Средство просмотра трассировки служб предоставляет средство, позволяющее открывать часть файла журнала, если файл & gt; 40 МБ, но это все еще слишком медленно. Похоже, в файле app.config нет возможности настроить файл .svclog для автоматического создания нового файла каждый день или при достижении файлом определенного размера.

Существует прослушиватель текстового журнала Microsoft.VisualBasic.Logging.FileLogTraceListener, который поддерживает logfilecreationschedule = & quot; Daily & quot; свойство, которое ежедневно обновляет файл журнала, однако результирующий файл журнала от этого прослушивателя трудно использовать специалисту по поддержке операций, поскольку записи журнала плохо отображаются, а большие документы xml способствуют путанице.

Какова лучшая практика в этой области, похоже, что мне, возможно, придется написать собственное расширение журнала WCF, которое кажется излишним, просто чтобы справиться с отсутствием функции прокрутки файла журнала во встроенном прослушивателе журнала System.Diagnostics.XmlWriterTraceListener / Appender.

Я также экспериментировал со сценарием, чтобы остановить приложение и переименовать файлы журналов, но это не представляется возможным, поскольку в Windows утилиты handle.exe и openfile не могут закрыть файл, открытый через сетевой ресурс, поэтому я не могу переименовать его. / переместить старый файл журнала, если кто-то просматривает его через общий сетевой ресурс. Скоро выложу отдельный вопрос об этом.

Спасибо, Мэтт.

 Lex Li10 июн. 2012 г., 04:41
Хотя это выполнимо, не обязательно, чтобы трассировка WCF была включена постоянно. Он разработан как метод устранения неполадок и влияет на производительность. Отключите его в производственной среде - это лучшая практика.

Ответы на вопрос(2)

Решение Вопроса

Вы можете развивать себя или использовать уже существующие специализированныеXmlWriterTraceListener или используйте механизм регистрации круговой трассировки.

Существует специализированная реализацияXmlWriterTraceListener который выполняет трассировку журналов в Codeproject:

http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener

Благодаря циклической трассировке у вас есть два файла, каждый из которых может хранить до половины всех требуемых данных журнала трассировки. Слушатель создает один файл и записывает в этот файл, пока он не достигнет предела половины размера данных, после чего он переключается на второй файл. Когда слушатель достигает предела для второго файла - он перезаписывает первый файл новыми трассами.

http://msdn.microsoft.com/en-us/library/aa395205.aspx

 MattG13 июн. 2012 г., 16:36
Спасибо, Серхио, вы либо действительно знаете, что ваш WCF, либо ваши возможности поиска в Интернете намного превосходят мои. Любой может, высоко ценится. Оба решения являются жизнеспособными. Не уверен, с чем я пойду пока. Я могу попробовать оба.

Я собрал воедино скрипт Powershell, который изменяет имя файла журнала в файле web.config SVC, а затем создал задание TaskScheduler, чтобы запускать скрипт ежечасно.

$a = (((get-date).ToUniversalTime()).ToString("yyyyMMddThhmmssZ"))
$myLogFile = "c:\temp\$a.svclog";
$webConfig = 'C:\inetpub\wwwroot\mySVCapi\Web.config'
Function updateConfig($config) 
{ 
$doc = (Get-Content $config) -as [Xml]
$activeConnection =$doc.configuration.'system.diagnostics'.sources.source.listeners.add#.initializeData
$activeConnection.SetAttribute("initializeData", $myLogFile);
$doc.Save($config)
} 
updateConfig($webConfig)

Сценарий предполагает, что у вас есть что-то вроде этого в вашем web.config:

  <system.diagnostics>
<sources>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\myDefaultLogFile.svclog" />
    </listeners>
  </source>
</sources>

В окне «Задачи» «Действие-Запустить программу» введитеPowershell.exe в окне «Программа / скрипт», а затем добавьте-ExecutionPolicy ByPass c:\yourfolder\amendWebConfig.ps1 в поле Добавить аргументы.

Задача запускается, а затем обновляет файл initializeData файла web.config, например, до

    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\20180606T020646Z.svclog" />
    </listeners>

Ваш ответ на вопрос