防止在 .NET 中使用 TraceSource 时出现垃圾前缀
Prevent the junky prefix that comes with using TraceSource in .NET
我刚刚将我的项目设置为使用 TraceSource/TraceListener 并使用 new ConsoleTraceListener()
添加了一个默认侦听器以将数据记录到输出 window。每行都有很多垃圾前缀。有什么办法可以防止这种情况吗?
FluentFTP Verbose: 0 : InterNetwork: 123.123.123.123
FluentFTP Verbose: 0 : 421 Too many connections (8) from this IP
FluentFTP Verbose: 0 : Disposing FtpClient object...
FluentFTP Information: 0 : QUIT
我只想要跟踪的字符串:
InterNetwork: 123.123.123.123
421 Too many connections (8) from this IP
Disposing FtpClient object...
QUIT
我使用的语法是:
private static readonly TraceSource m_traceSource = new TraceSource("FluentFTP") {
Switch = new SourceSwitch("sourceSwitch", "Verbose") { Level = SourceLevels.All }
};
...
m_traceSource.TraceEvent(TraceLevelTranslation(eventType), 0, message);
编辑: 这个问题有答案 here, here and here,但其中 NONE 涵盖了您不能修改 TraceListener 的用例,只有TraceSource.
我通过显式写入跟踪源的侦听器来做类似的事情...而不是调用 TraceEvent。如果您愿意这样做,您可以执行类似以下扩展方法的操作。请注意,它必须吃掉跟踪侦听器抛出的所有异常:
static object traceSync = new object( );
static int traceMessageNumber;
internal static void Emit( this TraceSource traceSource, TraceEventType eventType, string message, params object[ ] args )
{
try
{
lock ( traceSync )
{
var msgNum = Interlocked.Increment( ref traceMessageNumber );
if ( traceSource.Switch.ShouldTrace( eventType ) )
{
//--> format your message like you want...
var msg = YourMessageFormatter( msgNum, message, args );
foreach ( TraceListener listener in traceSource.Listeners )
{
try
{
listener.WriteLine( msg );
listener.Flush( );
}
catch { }
}
}
}
}
catch
{
//--> maybe we'll write an event log entry?
}
}
然后你可以调用它:
m_TraceSource.Emit( TraceLevelTranslation(eventType), message );
我刚刚将我的项目设置为使用 TraceSource/TraceListener 并使用 new ConsoleTraceListener()
添加了一个默认侦听器以将数据记录到输出 window。每行都有很多垃圾前缀。有什么办法可以防止这种情况吗?
FluentFTP Verbose: 0 : InterNetwork: 123.123.123.123
FluentFTP Verbose: 0 : 421 Too many connections (8) from this IP
FluentFTP Verbose: 0 : Disposing FtpClient object...
FluentFTP Information: 0 : QUIT
我只想要跟踪的字符串:
InterNetwork: 123.123.123.123
421 Too many connections (8) from this IP
Disposing FtpClient object...
QUIT
我使用的语法是:
private static readonly TraceSource m_traceSource = new TraceSource("FluentFTP") {
Switch = new SourceSwitch("sourceSwitch", "Verbose") { Level = SourceLevels.All }
};
...
m_traceSource.TraceEvent(TraceLevelTranslation(eventType), 0, message);
编辑: 这个问题有答案 here, here and here,但其中 NONE 涵盖了您不能修改 TraceListener 的用例,只有TraceSource.
我通过显式写入跟踪源的侦听器来做类似的事情...而不是调用 TraceEvent。如果您愿意这样做,您可以执行类似以下扩展方法的操作。请注意,它必须吃掉跟踪侦听器抛出的所有异常:
static object traceSync = new object( );
static int traceMessageNumber;
internal static void Emit( this TraceSource traceSource, TraceEventType eventType, string message, params object[ ] args )
{
try
{
lock ( traceSync )
{
var msgNum = Interlocked.Increment( ref traceMessageNumber );
if ( traceSource.Switch.ShouldTrace( eventType ) )
{
//--> format your message like you want...
var msg = YourMessageFormatter( msgNum, message, args );
foreach ( TraceListener listener in traceSource.Listeners )
{
try
{
listener.WriteLine( msg );
listener.Flush( );
}
catch { }
}
}
}
}
catch
{
//--> maybe we'll write an event log entry?
}
}
然后你可以调用它:
m_TraceSource.Emit( TraceLevelTranslation(eventType), message );