2013-06-12 29 views
1

我有一個應用程序需要將輸出重定向到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); 

工作正常,但我希望能夠重定向到多個地方,就像我知道重定向到Streamwriter一樣。

比方說,爲了討論,我希望它重定向到的StreamWriter,譜寫一個數據庫表中的行,也表明它在控制檯上,應該有人有手動運行該程序。 我會怎麼做呢?

我可以實現我自己的TextWriter和處理它在那裏,如果是的話,怎麼樣?

請讓我知道,如果我可以進一步澄清。

回答

2

最簡單的方法是做如你所說,寫自己的TextWriter派生類。然後您可以使用它寫入多個其他TextWriter實例。

Documentation for TextWriter說,在其「給繼承者」:

派生類必須至少實現TextWriter.Write(char)的方法進行的TextWriter的一個有用的實例。

所以派生類TextWriter會看起來像:

public class MultiTextWriter: TextWriter 
{ 
    private List<TextWriter> _writers = new List<TextWriter>(); 

    public 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)方法的性能會很好。這將取決於有多少數據正在傳出以及有多少個不同的目的地。

0

將輸出重定向到MemoryStream並對其進行監視(循環+睡眠)。數據到達後,將它發送到任何你需要的地方。

0

您可以創建從Stream類將只支持文字派生的CompositeStream類。在覆蓋的Write方法中,您可以寫入任意數量的基礎流。溶液

0

例:編寫您自己的類,自TextWriter派生將輸出回顯到一個StreamWriter和您的其他地方。