将控制台输出发送给多个编写器

时间:2013-06-12 11:10:41

标签: c#

我有一个应用程序需要将输出重定向到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);

这样做很好,但是我希望能够重定向到多个地方,就像我知道重定向到一个编写者一样。

让我们说,为了论证,我希望它重定向到streamwriter并在数据库的表中写入行,并在控制台中显示它,如果有人手动运行该程序。 我该怎么做呢?

我可以实现自己的TextWriter并在那里处理它,如果是,怎么做?

如果我能进一步澄清,请告诉我。

4 个答案:

答案 0 :(得分:2)

最简单的方法是按照您的建议并编写自己的TextWriter派生类。然后,您可以使用它来写入多个其他TextWriter个实例。

Documentation for 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
            }
        }
    }
}

并使用它......

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)方法才能表现得足够好。这取决于数据输出量和目的地数量。

答案 1 :(得分:0)

将输出重定向到MemoryStream,并监视它(循环+睡眠)。数据到达后,将其发送到您需要的任何地方。

答案 2 :(得分:0)

您可以创建一个CompositeStream类派生自Stream类,它只支持写作。在重写的Write方法中,您可以写入任意数量的底层流。

答案 3 :(得分:0)

解决方案示例:编写自己的类,该类派生自TextWriter,它将输出回显到StreamWriter和您的其他位置。