如何移除ConsoleTraceListener输出消息的前缀(不通过继承重写类)
移除ConsoleTraceListener跟踪消息前缀的替代方案
默认情况下,ConsoleTraceListener生成的跟踪消息会附带可执行文件名、日志级别及编号前缀,示例如下:
myExecutable.exe Information: 0 : Saving 3602 row(s)...
除了继承重写ConsoleTraceListener类,还有两种可行方法移除前缀,只保留消息本身:
方法一:用包装类结合正则替换处理消息
创建一个包装TraceListener的类,在输出时用正则表达式剥离前缀。示例代码:
public class PrefixCleaningTraceListener : TraceListener { private readonly TraceListener _wrappedListener; private static readonly Regex _prefixPattern = new Regex(@"^.*? : ", RegexOptions.Compiled); public PrefixCleaningTraceListener(TraceListener listener) { _wrappedListener = listener; } public override void Write(string message) { var cleanedMsg = _prefixPattern.Replace(message, string.Empty); _wrappedListener.Write(cleanedMsg); } public override void WriteLine(string message) { var cleanedMsg = _prefixPattern.Replace(message, string.Empty); _wrappedListener.WriteLine(cleanedMsg); } }
使用时替换原有监听器:
Trace.Listeners.Clear(); Trace.Listeners.Add(new PrefixCleaningTraceListener(new ConsoleTraceListener()));
方法二:通过配置文件自定义跟踪输出
在App.config或Web.config中配置跟踪源与监听器,通过过滤规则间接控制输出格式:
<system.diagnostics> <trace autoflush="true"> <listeners> <remove name="Default" /> <add name="customConsoleListener" type="System.Diagnostics.ConsoleTraceListener" /> </listeners> </trace> <sources> <source name="AppTraceSource" switchValue="Information"> <listeners> <add name="customConsoleListener" /> </listeners> </source> </sources> <switches> <add name="AppTraceSource" value="Information" /> </switches> </system.diagnostics>
之后使用指定的跟踪源输出消息:
private static readonly TraceSource _traceSource = new TraceSource("AppTraceSource"); _traceSource.TraceInformation("Saving 3602 row(s)...");
这种方式通过跟踪源直接输出消息内容,不会附带默认前缀,但需要统一替换原有的Trace调用为跟踪源的方法。
如果只是小范围使用,也可以直接手动输出消息(比如用Console.WriteLine代替Trace.WriteLine),但这种方式侵入性较高,不适合大规模修改。
内容的提问来源于stack exchange,提问作者Vadim Berman
相关产品推荐
相关产品推荐

