将控制台输出发送到多个写入器

本文关键字:控制台 输出 出发 | 更新日期: 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和您的其他位置