C# 将控制台输出发送到多个写入程序

C# 将控制台输出发送到多个写入程序,c#,C#,我有一个应用程序需要将输出重定向到Console.Write和Console.Writeline到其他地方 为了进一步说明,我的代码以一定的间隔启动一个进程。这个过程不是我写的,也不是我工作的公司写的,我没有源代码访问权限。 我捕获该过程的输出,因为我需要知道稍后在检查日志时是否出现故障之类的情况,所以我将输出重定向到如下文本文件: String filename = "the-log-file-with-a-datetime-stamp.txt"; FileStream filestream

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

假设为了参数起见,我希望它重定向到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);