无法获取要写入代码中配置的日志文件的WPF绑定错误跟踪信息

本文关键字:文件 日志 WPF 错误 信息 跟踪 绑定 配置 获取 代码 | 更新日期: 2023-09-27 18:11:23

我正在尝试调试我认为只发生在生产中的一台机器上的WPF绑定问题——我无法在开发人员机器上重现。为了做到这一点,我一直在尝试将绑定跟踪信息输出到日志文件。以下是像这样的答案,我已经能够通过在App.config中配置它来将其输出到硬编码的位置:

<system.diagnostics>
  <sources>
    <source name="System.Windows.Data" switchName="SourceSwitch" >
      <listeners>
        <add name="textListener" />
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="SourceSwitch" value="All" />
  </switches>
  <sharedListeners>
    <add name="textListener"
    type="System.Diagnostics.TextWriterTraceListener"
    initializeData="c:'BindingErrors.log" />
  </sharedListeners>
  <trace autoflush="true" indentsize="4"/>
</system.diagnostics>

这在我的机器上工作得很好,我对c:'驱动器有管理权限。问题是我想在用户有权的地方写日志,例如他们的TEMP文件夹。所以我想这样做,使用%TEMP%环境变量:

initializeData="%TEMP%'BindingErrors.log"

这不是工作,虽然,我猜它不会工作-看看这个答案;因此,按照该回答中的建议,我尝试通过代码而不是App.config配置输出。以下是我到目前为止所做的尝试:

var listener = new 
    TextWriterTraceListener(Environment.ExpandEnvironmentVariables(
    @"%TEMP%'BindingErrors.log"), "myListener");
Trace.Listeners.Add(listener);   
Trace.WriteLine("foo"); // just to see if it works at all.
Trace.Flush();

但是这只将foo写入%TEMP%文件夹中的日志文件。它不写绑定错误。我试图复制什么App.config,但没有Sources集合,所以当我实例化一个TraceSource,像这样:

var source = new TraceSource("mySource", SourceLevels.Information);

我不知道怎么处理它,没有Listeners集合,我可以添加我的listener实例。

MSDN似乎没有给我带来所有这些,或者我错过了一些关键的细节。有人能帮我弄清楚我做错了什么吗?

无法获取要写入代码中配置的日志文件的WPF绑定错误跟踪信息

& help;没有可以添加侦听器实例的侦听器集合。

实际上有:PresentationTraceSources.DataBindingSource .Listeners

属性返回输出数据绑定消息时使用的TraceSource对象。您可以向该源添加任何侦听器,例如通过展开%TEMP%环境变量并将其用作输出文件的目录,在代码隐藏中创建的TextWriterTraceListener

请注意,编程方法需要重新编译以更改输出位置,或者添加一些可以在运行时读取的其他配置值。另一种技术允许您在app.config文件中指定整个配置,方法是实现一个知道如何展开环境变量的自定义TraceListener

例如:

namespace TestSO39836570TraceListenerBindingErrors
{
    class EnvironmentAwareTextWriterTraceListener : TextWriterTraceListener
    {
        public EnvironmentAwareTextWriterTraceListener(string path)
            : base(Environment.ExpandEnvironmentVariables(path))
        { }
        public EnvironmentAwareTextWriterTraceListener(string path, string name)
            : base(Environment.ExpandEnvironmentVariables(path), name)
        { }
    }
}

然后在app.config文件中,你可以指定监听器:

<system.diagnostics>
  <sources>
    <source name="System.Windows.Data" switchName="SourceSwitch">
      <listeners>
        <add name="textListener"/>
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="SourceSwitch" value="All"/>
  </switches>
  <sharedListeners>
    <add name="textListener"
         type="TestSO39836570TraceListenerBindingErrors.EnvironmentAwareTextWriterTraceListener, TestSO39836570TraceListenerBindingErrors"
         initializeData="%temp%'BindingErrors.log"/>
  </sharedListeners>
  <trace autoflush="true" indentsize="4"/>
</system.diagnostics>

请注意,当指定自定义的TraceListener类型时,您需要在type属性中指定程序集名称,方法是在完全限定类型名称后面加上逗号,然后是程序集名称(在上面的示例中,类型的命名空间与程序集名称相同,根据visualstudio中创建的项目的默认值)。

当然,您可以选择比我在这里使用的名称空间和类型名称更短的名称空间和类型名称。:)