2

我有一个简单的控制台应用程序,它以格式良好的方式写出各种资源的状态。

此应用程序正在使用一些 3rd 方组件来连接到地点。

不幸的是,这些组件做了很多 Console.Writes(或某种日志记录),最终都与我的消息交织在一起。

我尝试重定向控制台输出(希望我可以过滤非我的消息),但这似乎只适用于我的消息。

var sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
Console.SetOut(tw);

所以这适用于重定向控制台写入,但仅限于我所做的那些.. 来自 3rd 方组件的输出仍在流式传输到我的屏幕.. 还有其他方法来抑制它吗?

4

3 回答 3

1

您无法重定向第三方组件输出的原因是因为您在您的流程上调用重定向,而不是他们的。为此,请遍历进程,找到正在写入控制台的进程并重定向它们的输出。

 using System.Diagnostics;

 Process[] processlist = Process.GetProcesses();


 foreach(Process theprocess in processlist){
       // you'll actually need to use something like the process name or id here.
       if (theprocess == MyThirdPartyComponentsProcess)
       {
             theprocess.StartInfo.UseShellExecute = false;
             theprocess.StartInfo.RedirectStandardOutput = true; 
        }
  }

您必须以管理员身份运行此工作。

于 2012-11-13T18:30:46.463 回答
0

我想到了一种相当老套的方法:

  • 捕获现有的Console.Out,以便您可以在“真正的”作家中重用它
  • 创建您自己的TextWriter实现,它...
  • ...当它被要求编写时,检查调用代码是否在您的程序集中。看Assembly.GetCallingAssembly

只要您没有内联问题,您应该能够检查上下文,并删除您不想要的任何输出。请注意,您可能必须Console.Out.WriteLine直接调用而不是调用Console.WriteLine- 否则调用者将是Console类。

更好的解决方案是将您的代码更改为使用 log4net 或类似的东西,这样您就可以以更可配置的方式获得输出,而不是在控制台上 - 假设您自己的使用也是日志记录。(如果是用于交互式输出,类似上面的东西可能是唯一的方法......)

于 2012-11-13T18:34:06.087 回答
0

因为似乎没有合理的快速方法来抑制这些,所以我选择了 B 计划,即将我的信息推迟到最后。这样所有的日志记录都通过了,然后我写出了我感兴趣的所有信息。

我将其分解为成功/警告/错误方法

    public static void WriteError(string message, params string[] args) {
        writerTasks.Add(() => {
            var c = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(message, args);
            Console.ForegroundColor = c;
        });
    }

在执行结束时,我调用此方法将其清除。

    private static void WriteResults() {
        foreach (var t in writerTasks)
            t();
    }

我这样做是因为我根据消息类型更改文本颜色,消息类型包含在每个操作中。

在我的情况下,这很好用,因为信息向上滚动隐藏所有日志记录..这实际上也是有益的..只是不希望它分散在主要输出之间

于 2012-11-13T22:07:53.823 回答