C# 将控制台输出发送到多个写入程序
我有一个应用程序需要将输出重定向到Console.Write和Console.Writeline到其他地方 为了进一步说明,我的代码以一定的间隔启动一个进程。这个过程不是我写的,也不是我工作的公司写的,我没有源代码访问权限。 我捕获该过程的输出,因为我需要知道稍后在检查日志时是否出现故障之类的情况,所以我将输出重定向到如下文本文件:C# 将控制台输出发送到多个写入程序,c#,C#,我有一个应用程序需要将输出重定向到Console.Write和Console.Writeline到其他地方 为了进一步说明,我的代码以一定的间隔启动一个进程。这个过程不是我写的,也不是我工作的公司写的,我没有源代码访问权限。 我捕获该过程的输出,因为我需要知道稍后在检查日志时是否出现故障之类的情况,所以我将输出重定向到如下文本文件: String filename = "the-log-file-with-a-datetime-stamp.txt"; FileStream filestream
String filename = "the-log-file-with-a-datetime-stamp.txt";
FileStream filestream = new FileStream(filename, FileMode.Create);
streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
这很好,但我希望能够重定向到多个地方,就像我知道的重定向到streamwriter一样
假设为了参数起见,我希望它重定向到streamwriter,并在数据库的表中写入该行,如果有人手动运行该程序,还可以在控制台中显示该行。
我该怎么做呢
我可以实现自己的TextWriter并在那里处理它吗?如果可以,如何处理
请告诉我是否可以进一步澄清。将输出重定向到MemoryStream,并对其进行监视(循环+睡眠)。数据到达后,将其发送到您需要的任何地方。您可以创建一个从该类派生的
CompositeStream
类,该类只支持写入。在重写方法中,您可以写入任意数量的底层流。解决方案示例:编写您自己的类,该类从TextWriter派生,将输出回显到StreamWriter和您的其他位置。最简单的方法是按照您的建议编写您自己的TextWriter
-派生类。然后,您可以使用它写入多个其他TextWriter
实例
在其“给继承人的注释”中说:
派生类必须最少实现TextWriter.Write(Char)方法,才能成为TextWriter的有用实例
因此,派生的TextWriter
类类似于:
public class MultiTextWriter: TextWriter
{
private List<TextWriter> _writers = new List<TextWriter>();
public void AddWriter(TextWriter writer)
{
_writers.Add(writer);
}
public override void Write(char ch)
{
foreach (var writer in _writers)
{
try
{
writer.Write(ch);
}
catch (ObjectDisposedException)
{
// handle exception here
}
catch (IOException)
{
// handle exception here
}
}
}
}
请注意,我的类和示例非常少。特别是,您需要添加关闭各个流的代码。您必须决定如何处理写入错误
如果您想获得更好的性能,可以重写其他TextWriter
write方法,但很有可能仅仅重写write(char)
方法就足够了。这将取决于有多少数据输出以及有多少不同的目的地
MultiTextWriter Writer = new MultiTextWriter();
StreamWriter sw1 = new StreamWriter(...);
StreamWriter sw2 = new StreamWriter(...);
Writer.AddWriter(sw1);
Writer.AddWriter(sw2);
Console.SetOut(Writer);
Console.SetError(Writer);