Ведение журнала ошибок в WCF - ничего не сохраняется в файле журнала при возникновении исключения - PullRequest
1 голос
/ 05 марта 2012

Я пытался перехватить исключения в моей службе WCF и сохранить их в файле журнала (я не хочу, чтобы клиент получал какие-либо конкретные сообщения об ошибках на этом этапе).

ПрочитавНесколько учебных пособий в Интернете. Я добавил некоторые настройки ведения журналов в раздел <system.diagnostics> файла web.config:

<sources>
  <source name="System.ServiceModel.MessageLogging" switchValue="Error">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelMessageLoggingListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelTraceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>    
<sharedListeners>
  <add initializeData="C:\inetpub\wwwroot\myApp\logs\Web_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
  <add initializeData="C:\inetpub\wwwroot\myApp\logs\Web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
</sharedListeners>

В случае исключения я попытался использовать Debug.WriteLine и Trace.WriteLine, ноничего не записывается в файл трассировки.

Я знаю, что IIS / WCF может записывать в файл журнала, если я установлю значение switchValue для любого из источников как Verbose, я получаю много информации (слишком много, чтобыиспользовать), но я хочу только код исключения.

1 Ответ

1 голос
/ 06 марта 2012

Попробуй это, рассмотрим следующий класс

public class TraceUtility 
{
    private TraceSource trcSrc;

    public TraceUtility(string traceSourceName)
    {
        if (string.IsNullOrEmpty(traceSourceName))
        {
            throw new ArgumentNullException(traceSourceName);
        }

        trcSrc = new TraceSource(traceSourceName);
    }

    public void TraceError(int id, string message)
    {
        trcSrc.TraceEvent(TraceEventType.Error, id, message);
    }

    public void TraceError(int id, string message, params object[] args)
    {
        trcSrc.TraceEvent(TraceEventType.Error, id, message, args);
    }

    public void TraceError(string message)
    {
        TraceError(0, message);
    }

    public void TraceError(string message, params object[] args)
    {
        TraceError(0, message, args);
    }

}

Теперь добавьте следующий раздел конфигурации в ваш файл конфигурации

<system.diagnostics>
    <sources>
        <source name="xyz" switchName="AllSwitch">
            <listeners>
                <add name="xyzListener"  type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Traces\xyz.txt" traceOutputOptions="DateTime" />
            </listeners>
        </source>
    </sources>
    <switches>
        <add name="AllSwitch" value="All"/>
        <add name="OnlyErrors" value="Error"/>
    </switches>
    <trace autoflush="true" indentsize="3"/>
</system.diagnostics>

Наконец, чтобы использовать его:

TraceUtilitiy trcSrc = new TraceUtility("xyz");

trcSrc.TraceError("Error: {0}", "Your error description");

Обратите внимание, что вы можете добавлять методы трассировки для информации и предупреждений в класс утилит трассировки, как я это делал с методами трассировки ошибок.

Надеюсь, это то, что вы ищете.

EDIT: Ваш другой код не был запущен, потому что вы не указали пользовательский прослушиватель для класса System.Diagnostics.Trace. Для этого добавьте следующий раздел в вашу конфигурацию:

  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <remove name="DefaultTraceListener" />

        <add name="LogFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Traces\xyz1.txt" />
      </listeners>
    </trace>
  </system.diagnostics>

и попробуйте использовать свой старый код. Надеюсь, это вас расстроит;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...