我有一个应用程序需要将输出重定向到 Console.Write 并将 Console.Writeline 重定向到其他地方。
为了进一步说明,我的代码以一定的时间间隔启动一个进程。这个过程不是由我或我工作的公司编写的,而且我没有源代码访问权限。 我捕获该过程的输出,因为我需要知道稍后何时检查日志是否出现故障,以及类似的内容,因此我将输出重定向到如下文本文件:
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
实例。
Documentation for TextWriter在其“继承人须知”中说道:
A derived class must minimally implement the TextWriter.Write(Char) method to make a useful instance of 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
}
}
}
}
并使用它...
MultiTextWriter Writer = new MultiTextWriter();
StreamWriter sw1 = new StreamWriter(...);
StreamWriter sw2 = new StreamWriter(...);
Writer.AddWriter(sw1);
Writer.AddWriter(sw2);
Console.SetOut(Writer);
Console.SetError(Writer);
请注意,我的类(class)和示例非常少。特别是,您需要添加关闭各个流的代码。您必须决定如何处理写入错误。
如果您希望获得更好的性能,您可以重写其他 TextWriter
写入方法,但很可能仅重写 Write(char)
方法就可以获得足够好的性能。这将取决于发出的数据量以及有多少个不同的目的地。
关于c# - 将控制台输出发送给多个编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17063975/