【问题标题】:Sending console output to multiple writers将控制台输出发送到多个编写器
【发布时间】:2013-06-12 11:10:41
【问题描述】:

我有一个应用程序需要将输出重定向到 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 并在那里处理吗?如果可以,如何处理?

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    最简单的方法是按照您的建议编写自己的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) 方法就足够了。这取决于有多少数据输出以及有多少不同的目的地。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-08
            • 2017-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-03
            • 1970-01-01
            • 2018-02-05
            相关资源
            最近更新 更多