【问题标题】:WCF tracing in code does not follow MessageLogging settings代码中的 WCF 跟踪不遵循 MessageLogging 设置
【发布时间】:2010-11-15 01:34:10
【问题描述】:

我需要在我的应用程序中使用 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;

这在某种程度上可以正常工作,主要问题是 app.config 文件的 system.servicemodel 部分中的消息记录设置被忽略。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 我看不到messageLogging 选项的配置位置。

标签: wcf logging trace


【解决方案1】:

我无法评论您的所有代码,因为我之前没有以这种方式使用过 System.Diagnostics(以编程方式配置 WCF 通信跟踪),但如果您打算在此行:

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

是设置您想要的跟踪级别,我认为您应该改用 Switch.Level 属性。 ShouldTrace 用于询问给定的 TraceSource 是否会在给定输入标志的情况下进行跟踪。

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

请注意,根据this link,可以配置明显合理的设置,但可能无法正确传播活动 ID。仔细阅读。它可能适用于您的情况。

【讨论】:

  • 这似乎没有多大帮助。也许我之前没有说清楚,但基本跟踪本身是有效的。但我只看到 app.config 文件中的标题和其他消息记录设置肯定被忽略了。
【解决方案2】:
  1. 您需要通过定义此MSDN Library page 中指示的跟踪源来启用MessageLogging。因此,您需要在 app.config 中的 sources 部分添加这个额外的位:

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

消息记录设置不适用于 System.ServiceModel 跟踪源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2020-08-12
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多