我最近在研究TraceSource的文档.Microsift说TraceSource是一种新方法,应该使用而不是旧的Trace类.
// create single TraceSource instance to be used for logging
static TraceSource ts = new TraceSource("TraceTest");
// somewhere in the code
ts.TraceEvent(TraceEventType.Warning, 2, "File Test not found");
Run Code Online (Sandbox Code Playgroud)
现在我的问题.你有大型项目,有几个程序集,你有很多类.假设您想跟踪跨类传播的特定功能.明显的想法是你需要创建一个特定的TraceSource.
1)要使用Tracesource,我需要先创建实例.什么是MS考虑跨各种类或程序集共享此实例?我应该创建一个具有静态单例属性的虚拟类吗?在那种情况下你在做什么
2)为什么我需要TraceSource实例?配置文件中描述了每个属性.基于Trace类的旧逻辑不需要某些实例,只提供了使用静态方法的方法.
我们有一个巨大的C#代码库,它使用.Net跟踪和自定义跟踪侦听器进行日志记录.我正在探索动态更改跟踪级别的选项(从警告到详细等).我希望有一种方法可以从跟踪侦听器更改跟踪级别,我可以修改自定义侦听器以更改跟踪源上的日志级别.但这似乎不可能.有没有一种简单的方法可以从跟踪侦听器中获取traceource对象(没有反射..)?我试图避免从TraceSource派生来实现动态跟踪级别,因为它将涉及大量的代码更改.有什么建议?
以下是我们追踪的典型方式:
TraceSource ts = new TraceSource("TestLogSource");
ts.TraceEvent(TraceEventType.Warning, 0, "warning message");
ts.TraceEvent(TraceEventType.Error, 0, "error message");
<system.diagnostics>
<sources>
<source name="TestLogSource" switchName="GlobalSwitch">
<listeners>
<add name="TestLog"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="TestLog" initializeData="test.svclog" type="Library.RolloverXmlTraceListener, Library, Version=4.0.0.0, Culture=neutral, PublicKeyToken=1234.."/>
</sharedListeners>
<switches>
<add name="GlobalSwitch" value="Warning" />
</switches>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud) 我的(本地,windows/mono)应用程序将重要事件记录到文本文件中.在突然崩溃/失败/强行退出的情况下,没有数据应保持不成文(尽可能).因此,我目前使用简单的追加文本文件方法:
Public Shared Sub LogAppEvent(ByVal EventData As String)
Dim Config As ConfigHandler = ConfigHandler.GetSingleton()
Dim AppLog As New IO.StreamWriter(Config.GetUserFilesRootDir() & ConfigOptions.AppLogName, True)
AppLog.WriteLine(String.Format("[{0}] {1}", Date.Now.ToString(), EventData))
AppLog.Close()
End Sub
Run Code Online (Sandbox Code Playgroud)
这是非常次优的,但是日志事件非常罕见.你会建议搬到System.Diagnostics伐木班吗?
或者你可以建议另一个解决方案?
在我的app.config中,我想设置3个跟踪级别(交换机?):详细,警告和无.在代码的调试版本中,我想要在我想要警告的版本中激活详细开关.在特殊情况下,我的应用程序用户可以修改配置文件以禁用所有跟踪.
我希望在控制台上输出调试跟踪,而发布只跟踪到日志文件.
我写了以下内容:
[...]
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="debug" switchName="debug">
<listeners>
<add name="FileLog"/>
<add name="console"/>
</listeners>
</source>
<source name="release" switchName="release">
<listeners>
<add name="FileLog"/>
</listeners>
</source>
<source name="silent" switchName="none">
<listeners/>
</source>
</sources>
<switches>
<add name="debug" value="Verbose"/>
<add name="release" value="Warning"/>
<add name="none" value="Off"/>
</switches>
<!--<sharedListeners>
<add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
</sharedListeners>-->
<trace autoflush="false" indentsize="4">
<listeners>
<add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
<remove name="Default"/>
</listeners>
</trace> …Run Code Online (Sandbox Code Playgroud)