谁知道System.Diagnostic.Trace
和System.Diagnostic.TraceSource
班级之间的区别?
我一直在使用Trace来完成我的大部分项目,而且我刚刚发现了TraceSource
前几天.他们似乎提供类似的API,是一个比另一个更好?
以下代码:
static void Main(string[] args)
{
TraceSource ts = new TraceSource("MyApplication");
ts.Switch = new SourceSwitch("MySwitch");
ts.Switch.Level = SourceLevels.All;
ts.Listeners.Add(new TextWriterTraceListener(Console.Out));
ts.TraceInformation("Hello World");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
MyApplication信息:0:Hello World
跟踪输出开头的"MyApplication Information:0:"部分来自TraceSource类本身.
但是,我需要在行的开头有一个时间戳,我想将"信息"更改为"信息".
有没有办法在跟踪输出中获得更多自由,这样我可以将其配置为:
13:03:00 - MyApplication Info:Hello World
我尝试了几个小时,但没有成功.无论我做什么,在输出行的开头,始终有这个常量预定义的"MyApplication Information:0:Hello World"输出.
MSDN文档也没有透露任何有用的信息.
如果一个应用程序将其所有活动数据写入一个日志文件中,是否有使用多个TraceSource的用途?我只是对代码中需要多个TraceSource的用例感到好奇.
我正在使用System.Diagnostics.TraceSource进行日志记录,我的一个侦听器是TextWriterTraceListener.在跟踪引物中,它将其设置如下:
<listeners>
<add initializeData="output.txt"
type="System.Diagnostics.TextWriterTraceListener"
name="myLocalListener" />
</listeners>
Run Code Online (Sandbox Code Playgroud)
问题是这将始终附加到output.txt.如何在配置文件中将其更改为覆盖?
以编程方式我想要的听众是:
new TextWriterTraceListener(new StreamWriter("output.txt", false));
Run Code Online (Sandbox Code Playgroud) TraceSource类的MSDN文档中有一个示例,说明app.config文件如何列出TraceSource实例的信息:
http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx
但是,没有关于TraceSource值存储位置的信息...现有的TraceSource对象存储在哪里?什么时候(编辑:它们意味着配置的实例)构建?在创建TraceSource对象时,TraceSource对象如何知道如何返回命名实例(编辑:应该配置实例)而不是新实例?我可以在不使用Reflection的情况下找到现有TraceSource对象的列表吗?
在我的应用程序中,我有以下日志记录策略/附加程序:
这在整个应用程序中都非常有效,直到我使用IAppBuilder
界面启动 OWIN 网络主机的第一行。我一调用WebApp.Start
,就注意到以下行为:
经过进一步调查,我发现 OWIN 默默地将System.Diagnostics.DefaultTraceListener
和的实例附加System.Diagnostics.TextWriterTraceListener
到默认跟踪/调试输出,这可能是问题的根源。但是,DefaultTraceListener
在 app.config 中明确声明并没有帮助。
有什么办法可以将 OWIN 配置为不那么......偷偷摸摸?
TraceSource 可以从System.Diagnostics
我的 ASP .NET Core 项目中访问。
在 src 文件中,您可以找到标头:
#region Assembly System.Diagnostics.TraceSource, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.2.0\ref\netcoreapp2.2\System.Diagnostics.TraceSource.dll
#endregion
Run Code Online (Sandbox Code Playgroud)
这是什么意思?.Net Famework >=4.1.1.0 的版本可以接受吗?TraceSource 是否包含在某些版本的 .Net Standard 中?
更新我的解决方案: 它需要配置。
1) app.config 仅适用于 .NET Framework,https://github.com/dotnet/corefx/issues/24829
2) .Net Core 草案:
TraceSource.Listeners.Add(new MyListener());
TraceSource.Switch = new SourceSwitch();
Run Code Online (Sandbox Code Playgroud) 我有一个课程的实例,可以存在很长时间(几个小时到几个月).它有一个将日志事件输出到文本文件的方法C:\mylog.txt
.如下
public MyClass
{
private static System.Diagnostics.TraceSource traceSource = new System.Diagnostics.TraceSource("My.Source");
private static void MyMethod()
{
traceSource.TraceEvent(System.Diagnostics.TraceEventType.Information, 0, "MyMethod called.");
}
}
Run Code Online (Sandbox Code Playgroud)
这C:\mylog.txt
可能会变得非常大,我想删除它.但我无法删除该文件,因为它被锁定traceSource
(通过终止进程我可以删除文件).
所有示例都将System.Diagnostics.TraceSource
其实例声明为上面的静态类成员.鉴于我的情况,在下面的方法中初始化它是否可以接受?
public MyClass
{
private static void MyMethod()
{
var traceSource = new System.Diagnostics.TraceSource("My.Source");
traceSource.TraceEvent(System.Diagnostics.TraceEventType.Information, 0, "MyMethod called.");
}
}
Run Code Online (Sandbox Code Playgroud)
或者是否有必须声明为静态的特定原因?难道我做错了什么?文件是否锁定了预期/必需的行为?
我正在向ASP.NET网站添加跟踪功能,所以我决定通过创建几个原型来研究TraceSource ; Web应用程序项目和网站项目.
我正在为每个项目使用类似的Web.config来记录到Windows事件日志的跟踪:
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0"/>
</system.web>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="HelloWorld">
<listeners>
<add name="eventlogListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="eventlogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="My Source" />
</sharedListeners>
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我只是从以下基本跟踪开始:
private static TraceSource _ts = new TraceSource("HelloWorld", SourceLevels.All);
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_ts.TraceEvent(TraceEventType.Information, 10, "Greetings from OnLoad.");
}
Run Code Online (Sandbox Code Playgroud)
使用Web应用程序项目,我可以看到在事件日志中创建的跟踪.但是,有了网站项目,我不能.
网站项目需要使用TraceSource的其他步骤(例如:web.config设置,权限等)吗?
我正在使用next方法添加跟踪记录:
TraceSource.TraceEvent(TraceEventType, Int32, String)
Run Code Online (Sandbox Code Playgroud)
其中Int32表示事件ID.
那么如何在TraceSwitch中过滤以仅按指定的事件ID进行监听?呃,这是不可能的?
<system.diagnostics>
<sources>
<source name="MyTraceSource" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch>"
<listeners>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" />
</listeners>
</source>
</sources>
<switches>
<add name="sourceSwitch" value="?" />
</switches>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud) 我试图使用Trace.CorrelationManager.ActivityId来关联日志条目.但是,我发现此代码完成时:
var result = await Task.Run(() => LongRunningMethod());
Run Code Online (Sandbox Code Playgroud)
ActivityId已经从输入时改变了.在LongRunningMethod()中它是正确的(我在方法中有各种跟踪事件),它似乎只在await完成时改变.
我的问题是为什么ActivityId改变了?
这行代码在使用async声明的函数中,而async又由MVC项目中的异步控制器操作调用:
async public Task<ActionResult> Index()
{
...
var tasks = {list of Download<T> delegates}
var result = await Task.WhenAll(tasks)
}
async public Task<OperationResult> Download<T>(IEnumerable<T> data, Device device)
{
...
var result = await Task.Run(() => LongRunningMethod());
return result
}
Run Code Online (Sandbox Code Playgroud)
也许我错误地使用async/await或Task方法?我基本上希望所有'LongRunningMethod'同时异步启动,然后等到所有完成.
tracesource ×11
c# ×10
.net ×5
app-config ×2
logging ×2
trace ×2
.net-4.0 ×1
.net-core ×1
asp.net ×1
async-await ×1
debugging ×1
log4net ×1
owin ×1
traceswitch ×1