Трассировка WCF в коде не соответствует настройкам MessageLogging - PullRequest
3 голосов
/ 15 ноября 2010

Мне нужно использовать трассировку WCF в моем приложении, но нужно как можно больше контролировать из кода.

Было предложено установить следующие разделы в моем файле app.config:

<configuration>
  <system.serviceModel>
    <diagnostics>
      <messageLogging
        maxMessagesToLog="100"
        logEntireMessage="true"
        logMessagesAtServiceLevel="true"
        logMalformedMessages="true"
        logMessagesAtTransportLevel="true">
      </messageLogging>
    </diagnostics>
  </system.serviceModel>  
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" >
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="dummy"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Тогда для запуска трассировки можно использовать следующий код:

BindingFlags privateMember = BindingFlags.NonPublic | BindingFlags.Instance;
BindingFlags privateStaticMember = privateMember | BindingFlags.Static;

Type type = Type.GetType("System.ServiceModel.DiagnosticUtility, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
MethodInfo[] mi = type.GetMethods(privateStaticMember);

// invoke InitializeTracing   
object diagnosticTrace = mi.FirstOrDefault(e => e.Name == "InitializeTracing").Invoke(null, null);
if (diagnosticTrace != null)
{
    // get TraceSource   
    Type type2 = Type.GetType("System.ServiceModel.Diagnostics.DiagnosticTrace, SMDiagnostics, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    PropertyInfo pi = type2.GetProperty("TraceSource", privateMember);
    TraceSource traceSource = pi.GetValue(diagnosticTrace, null) as TraceSource;

    // clear all listeners in the trace source   
    traceSource.Listeners.Clear();

    // add listener to trace source   
    XmlWriterTraceListener listener = new XmlWriterTraceListener("mylogfile".svclog");
    listener.TraceOutputOptions = TraceOptions.Timestamp | TraceOptions.Callstack;
    traceSource.Attributes["propagateActivity"] = "true";
    traceSource.Switch.ShouldTrace(TraceEventType.Verbose | TraceEventType.Start);
    traceSource.Listeners.Add(listener);

    // enable tracing   
    type.GetProperty("Level", privateStaticMember).SetValue(null, SourceLevels.All, null);

    Trace.AutoFlush = true;

До определенного момента это работает нормально, основная проблема заключается в том, что настройки ведения журнала сообщений в разделе system.servicemodel файла app.config игнорируются.

Можно ли что-нибудь сделать, чтобы решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2015
  1. Необходимо включить функцию MessageLogging, указав источник трассировки, как указано на этой странице Библиотека MSDN . Итак, вам нужен этот дополнительный бит в файле app.config в разделе sources:

    <source name="System.ServiceModel.MessageLogging">
       <listeners>
         <add type="System.Diagnostics.DefaultTraceListener" name="dummy"/>
      <remove name="Default" />
    </listeners>      </source>
    

Параметры ведения журнала сообщений не применяются к источнику трассировки System.ServiceModel.

0 голосов
/ 15 ноября 2010

Я не могу комментировать весь ваш код, потому что раньше я не использовал System.Diagnostics таким образом (программная настройка трассировки связи WCF), но если ваше намерение в этой строке:

traceSource.Switch.ShouldTrace(TraceEventType.Verbose | TraceEventType.Start);

Чтобы установить желаемый уровень трассировки, я думаю, что вы должны использовать вместо этого свойство Switch.Level. ShouldTrace для запроса, будет ли данный TraceSource отслеживать , учитывая флаги ввода.

traceSource.Switch.Level = SourceLevels.Verbose | SourceLevels.ActivityTracing; 

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

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