将C#的Console.Write同步到控制台和log文件输出

将C#的Console.Write同步到控制台和log文件输出

日常编写小工具时,使用Console.Write会把日志输出到控制台中,这便于在运行过程查看日志,但如果日志过多,或者希望能对日志进行查找,复制操作时,在控制台中就不方便操作了,这时就希望能把日志输出到log文件中,通过Console.SetOut可以将输出重定向到文件,不过这样就不方便在运行时查看日志进度。有没有办法可以把日志同步输出到控制台和log文件中呢?
参考StackOverflow的一个回答,其实原理很简单,就是我们自己实现一个TextWriter,它接收一个文件和原Console的输出流,然后将输出重定向到这个TextWriter,就可以了。
代码如下:

public class ConsoleCopy : IDisposable
{
    private FileStream m_FileStream;
    private StreamWriter m_FileWriter;

    private readonly TextWriter m_DoubleWriter;
    private readonly TextWriter m_OldOut;

    private class DoubleWriter : TextWriter
    {
        private TextWriter m_One;
        private TextWriter m_Two;

        public DoubleWriter(TextWriter one, TextWriter two)
        {
            m_One = one;
            m_Two = two;
        }

        public override Encoding Encoding
        {
            get { return m_One.Encoding; }
        }

        public override void Flush()
        {
            m_One.Flush();
            m_Two.Flush();
        }

        public override void Write(char value)
        {
            m_One.Write(value);
            m_Two.Write(value);
        }
    }

    public ConsoleCopy(string path)
    {
        m_OldOut = Console.Out;

        try {
            m_FileStream = File.Create(path);

            m_FileWriter = new StreamWriter(m_FileStream)
            {
                AutoFlush = true
            };

            m_DoubleWriter = new DoubleWriter(m_FileWriter, m_OldOut);
        }
        catch (Exception e) {
            Console.WriteLine("Cannot open file for writing");
            Console.WriteLine(e.Message);
            return;
        }
        Console.SetOut(m_DoubleWriter);
    }

    public void Dispose()
    {
        Console.SetOut(m_OldOut);

        if (m_FileWriter != null) {
            m_FileWriter.Flush();
            m_FileWriter.Close();
            m_FileWriter = null;
        }
        if (m_FileStream != null) {
            m_FileStream.Close();
            m_FileStream = null;
        }
    }
}

使用方法如下:

using (var cc = new ConsoleCopy("mylogfile.txt"))
{
  Console.WriteLine("testing 1-2-3");
  Console.WriteLine("testing 4-5-6");
  Console.ReadKey();
}

这个方法最大的好处就是不用修改原有的Console.Write,只要在程序入口处将主逻辑用using包住,内部所有的输出都能同步输出到控制台和log文件了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值