无法获取要写入代码中配置的日志文件的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似乎没有给我带来所有这些,或者我错过了一些关键的细节。有人能帮我弄清楚我做错了什么吗?
& 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中创建的项目的默认值)。