我需要在我的应用程序中使用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设置被忽略。
有什么办法可以解决这个问题吗?
答案 0 :(得分:0)
我无法对您的所有代码发表评论,因为我之前没有以这种方式使用过System.Diagnostics(以编程方式配置WCF通信跟踪),但如果您的意图在这一行:
traceSource.Switch.ShouldTrace(TraceEventType.Verbose | TraceEventType.Start)
;
是设置所需的跟踪级别,我认为您应该使用Switch.Level属性。在给定输入标志的情况下,ShouldTrace用于询问给定的TraceSource 是否跟踪。
traceSource.Switch.Level = SourceLevels.Verbose | SourceLevels.ActivityTracing;
请注意,根据this link,可以配置明显合理的设置,但活动ID可能无法正确传播。仔细阅读。它可能适用于您的情况,也可能不适用。
答案 1 :(得分:-1)
您需要通过定义跟踪源来启用MessageLogging,如MSDN Library page所示。因此,您需要在sources
部分的app.config中添加这一额外内容:
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="dummy"/>
<remove name="Default" />
</listeners> </source>
消息日志记录设置不适用于System.ServiceModel跟踪源。