将控制台输出发送到多个写入器
本文关键字:控制台 输出 出发 | 更新日期: 2023-09-27 18:17:57
我有一个需要将输出重定向到Console的应用程序。写和控制台。
为了进一步说明,我的代码每隔一段时间启动一个进程。这个过程不是由我或我工作的公司编写的,我没有源代码访问权限。我捕获了该过程的输出,因为我需要知道以后在检查日志时是否出现了故障,所以我将输出重定向到一个文本文件,如下所示:
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);
这工作很好,在某种程度上,但我希望能够重定向到多个地方,就像我知道重定向到一个流写入器。
让我们说为了参数的缘故,我希望它重定向到流写入器,并在数据库中的表中写入行,并在控制台中显示它,如果有人手动运行程序。我该怎么做呢?
我可以实现我自己的TextWriter并在那里处理它,如果可以,如何?
如果我还需要进一步说明,请告诉我。
最简单的方法是按照您的建议编写您自己的TextWriter
派生类。然后,您可以使用它来写入多个其他TextWriter
实例。
TextWriter的文档在"给继承者的说明"中说:
派生类必须最低限度地实现texttwriter . write (Char)方法,以创建一个有用的texttwriter实例。
所以你的衍生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
}
}
}
}
和使用它…
MultiTextWriter Writer = new MultiTextWriter();
StreamWriter sw1 = new StreamWriter(...);
StreamWriter sw2 = new StreamWriter(...);
Writer.AddWriter(sw1);
Writer.AddWriter(sw2);
Console.SetOut(Writer);
Console.SetError(Writer);
请注意,我的类和示例都非常小。特别是,您需要添加关闭单个流的代码。您还必须决定如何处理写错误。
如果您想获得更好的性能,您可以覆盖其他TextWriter
写方法,但是很有可能仅仅覆盖Write(char)
方法就会执行得足够好。这取决于要输出多少数据以及有多少不同的目的地。
将输出重定向到MemoryStream,并监视它(周期+睡眠)。数据到达后,发送到您需要的任何地方。
您可以创建从Stream
类派生的CompositeStream
类,它将只支持写入。在重写的Write
方法中,您可以写入任意数量的底层流。
解决方案示例:编写您自己的类,该类派生自textwwriter,它将返回输出到StreamWriter和您的其他位置