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

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

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

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

更新

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

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

class ConsoleLogger : System.IO.TextWriter { private System.IO.TextWriter oldOut; private Queue log = new Queue(); 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... } 

您可以编写一个新的TextWriter ,它的Write调用填充列表而不是写入流。 然后,您需要通过Console.SetOut(...)进行设置

使用Console.SetOut可以设置自定义实现的TextWriter。

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

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

如果你想编写如下代码:

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

然后你可以有代码:

  private static Queue q = new Queue(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); } 

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

请参阅从.NET应用程序捕获控制台输出(C#) 。