1

如果我看到一些关键词出现在Console.Out. 这是因为我们使用了第三方 DLL,它有一个问题,即当它遇到某些特定异常时它永远不会退出。

对我们来说唯一的不满似乎是监视填充回的日志console.Out。并且基于登录console.out,主机应用程序可以决定遇到此类异常时要做什么。

有人告诉我,我可以使用跟踪侦听器......但我不确定。你们有什么感想?

4

2 回答 2

4

该类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!
于 2012-05-14T22:26:15.477 回答
0

如果你可以把它包装成一个 exe,也许你可以使用 Process.StandardOutput。

于 2012-05-14T22:26:26.333 回答