我有一个简单的控制台应用程序,以一种格式良好的方式写出各种资源的状态。
此应用使用一些第三方组件连接到地方。
不幸的是,那些组件做了很多Console.Writes(或某种日志记录),它们都与我的消息交织在一起。
我尝试重定向控制台输出(希望我可以过滤非矿井消息),但这似乎只适用于我的消息。
var sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
Console.SetOut(tw);
所以这适用于重定向控制台写入,但仅限于我所做的..来自第三方组件的输出仍然流式传输到我的屏幕..任何其他方式来抑制它?
答案 0 :(得分: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;
}
}
您必须以管理员身份运行此工作。
答案 1 :(得分:0)
我想到了一种相当黑客的方式:
Console.Out
,以便您可以在“真正的”作家TextWriter
实施,其中...... Assembly.GetCallingAssembly
只要您没有内联问题,就应该能够检查上下文,并删除任何您不想要的输出。您可能需要直接拨打Console.Out.WriteLine
而不是Console.WriteLine
,请注意 - 否则调用者将是Console
类。
更好的解决方案是将您的代码更改为使用log4net或类似的东西,这样您就可以以更可配置的方式获取输出,而不是在控制台上 - 假设您自己的用途也是。 (如果它是用于交互式输出,那么类似上面的内容可能是唯一的方法......)
答案 2 :(得分: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();
}
我是这样做的,因为我根据消息类型改变文本颜色,消息类型包含在每个动作中。
在我的情况下这很有效,因为信息向上滚动隐藏所有日志记录..这实际上也是有益的..只是不希望它分散在主输出之间