有没有办法将Console.Write的结果连续镜像到集合(数组,列表等)?

时间:2011-03-20 11:36:21

标签: c# .net visual-studio .net-4.0 c#-4.0

我有一个控制台程序,我想不断将Console.Write的结果镜像到一个集合,我可以实时查看它的尾部。该集合可以是数组,列表等。

我假设我必须使用某种事件处理程序?

我不介意被指向第三方库的方向,例如NLOG。

更新

我需要在内存中维护一个集合,它反映当前的控制台状态(然后我可以使用套接字发送到远程WinForms应用程序)。除了详细信息之外,我想我可以用几行C#来做到这一点 - 我不想在没有它的情况下添加一个巨大的日志库。

7 个答案:

答案 0 :(得分:5)

Console类允许您替换输出和错误流。正如您在此需要的那样,您可以使用TextWriter替换它们,TextWriter也会记录所写的内容。示例实现:

    class ConsoleLogger : System.IO.TextWriter {
        private System.IO.TextWriter oldOut;
        private Queue<string> log = new Queue<string>();
        private StringBuilder line = new StringBuilder();
        private object locker = new object();
        private int newline;
        private int logmax;

        public ConsoleLogger(int history) {
            logmax = history;
            oldOut = Console.Out;
            Console.SetOut(this);
        }
        public override Encoding Encoding {
            get { return oldOut.Encoding; }
        }
        public override void Write(char value) {
            oldOut.Write(value);
            lock (locker) {
                if (value == '\r') newline++;
                else if (value == '\n') {
                    log.Enqueue(line.ToString());
                    if (log.Count > logmax) log.Dequeue();
                    line.Length = newline = 0;
                }
                else {
                    for (; newline > 0; newline--) line.Append('\r');
                    line.Append(value);
                }
            }
        }
    }

用法:

    static void Main(string[] args) {
        var outLogger = new ConsoleLogger(100);
        // etc...
    }

答案 1 :(得分:2)

你可能会写一个新的TextWriter WriteConsole.SetOut(...)个调用填充列表而不是写入流。然后,您需要通过{{1}}

进行设置

答案 2 :(得分:2)

使用Console.SetOut,您可以设置自定义的TextWriter。

答案 3 :(得分:1)

您可以创建一个简单的帮助方法并调用它而不是Console.Write。

private void WriteToConsole(string message)
{
    myList.Add(message);

    Console.Write(message);
}

答案 4 :(得分:1)

如果你想编写如下代码:

    WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578);

然后你可以有代码:

    private static Queue<String> q = new Queue<String>(1000);
    private static void WriteToConsole(String message)
    {
        q.Enqueue(message);
        Console.Write(message);
    }
    private static void WriteToConsole(String message, params Object[] r)
    {
        String s = String.Format(message, r);
        q.Enqueue(s);
        Console.Write(s);
    }

答案 5 :(得分:0)

使用log4net在文件中连续转储,然后将其用于尾部:http://tailf.codeplex.com/

答案 6 :(得分:0)