gpt4 book ai didi

代码中的 WCF 跟踪不遵循 MessageLogging 设置

转载 作者:行者123 更新时间:2023-12-04 23:25:29 25 4
gpt4 key购买 nike

我需要在我的应用程序中使用 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 部分中的消息记录设置被忽略了。

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

最佳答案

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

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

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

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

注意根据this link ,可以配置看似合理的设置,但事件 ID 可能无法正确传播。仔细阅读。它可能适用于也可能不适用于您的情况。

关于代码中的 WCF 跟踪不遵循 MessageLogging 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com