如果我看到一些关键词出现在Console.Out
. 这是因为我们使用了第三方 DLL,它有一个问题,即当它遇到某些特定异常时它永远不会退出。
对我们来说唯一的不满似乎是监视填充回的日志console.Out
。并且基于登录console.out
,主机应用程序可以决定遇到此类异常时要做什么。
有人告诉我,我可以使用跟踪侦听器......但我不确定。你们有什么感想?
如果我看到一些关键词出现在Console.Out
. 这是因为我们使用了第三方 DLL,它有一个问题,即当它遇到某些特定异常时它永远不会退出。
对我们来说唯一的不满似乎是监视填充回的日志console.Out
。并且基于登录console.out
,主机应用程序可以决定遇到此类异常时要做什么。
有人告诉我,我可以使用跟踪侦听器......但我不确定。你们有什么感想?
该类Console
提供了SetOut
可用于将输出写入自定义流的方法。例如,您可以流式传输到 StringBuilder 并监视更改,或者编写监视关键字的自定义流实现。
例如,这是一个KeywordWatcherStreamWrapper
监视指定关键字的类,并在看到关键字时为所有侦听器引发一个事件:
public class KeywordWatcherStreamWrapper : TextWriter
{
private TextWriter underlyingStream;
private string keyword;
public event EventHandler KeywordFound;
public KeywordWatcherStreamWrapper(TextWriter underlyingStream, string keyword)
{
this.underlyingStream = underlyingStream;
this.keyword = keyword;
}
public override Encoding Encoding
{
get { return this.underlyingStream.Encoding; }
}
public override void Write(string s)
{
this.underlyingStream.Write(s);
if (s.Contains(keyword))
if (KeywordFound != null)
KeywordFound(this, EventArgs.Empty);
}
public override void WriteLine(string s)
{
this.underlyingStream.WriteLine(s);
if (s.Contains(keyword))
if (KeywordFound != null)
KeywordFound(this, EventArgs.Empty);
}
}
示例用法:
var kw = new KeywordWatcherStreamWrapper(Console.Out, "Hello");
kw.KeywordFound += (s, e) => { throw new Exception("Keyword found!"); };
try {
Console.SetOut(kw);
Console.WriteLine("Testing");
Console.WriteLine("Hel");
Console.WriteLine("lo");
Console.WriteLine("Hello");
Console.WriteLine("Final");
} catch (Exception ex) { Console.Write(ex.Message); }
在包含整个关键字的第二Write
条语句中,将引发事件并因此引发异常。另请注意,这会默默地包装底层流并仍对其进行写入,因此仍会正常生成控制台输出。
样本输出:
Testing
Hel
lo
Hello
Keyword found!
如果你可以把它包装成一个 exe,也许你可以使用 Process.StandardOutput。