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

标签 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);

这在某种程度上工作正常,但我希望能够重定向到多个地方,就像我知道重定向到流编写器一样。

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

我可以实现自己的 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/

相关文章:

c# - SqlDependency立即触发

c# - 自动模拟 Web Api 2 Controller

c# - 如何在 MVVM WPF 的主窗口中打开子窗口

c# - 使 WebBrowser 控件在 DocumentText 中使用链接样式表

c# - 请推荐一个Mono(即C#)的音频阅读库

c# - REST WCF 服务 - 差异数据输入格式 (JSON/XML)

c# - (byte)Convert.ToChar(anyStringOfLengthOne) 怎么可能抛出错误?

c# - 使用 jquery ajax 调用 C# webmethod 省略可选参数

c# - 在 C# 中重定向页面之前设置超时

c# - 删除最后 N 条记录, Entity Framework