2013-06-12 8 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로 리디렉션하고 데이터베이스의 테이블에 라인을 작성하고 콘솔에 표시하기를 원합니다. 어떻게 생각하나요?

내 자신의 TextWriter를 구현하고 처리 할 수 ​​있습니까? 그렇다면 어떻게 처리 할 수 ​​있습니까?

내가 더 명확하게 할 수 있는지 알려 주시기 바랍니다.

답변

2

가장 간단한 방법은 나만의 TextWriter 클래스를 제안하고 작성하는 것입니다. 그런 다음 여러 다른 TextWriter 인스턴스에 쓸 수 있습니다.

Documentation for TextWriter는 "상속자 참고 사항"의에서 말한다 :

파생 클래스는 최소한 TextWriter에서의 유용한 인스턴스를 만들 수있는 TextWriter.Write (샤아) 메소드를 구현해야합니다. ... 내 클래스와 예는 꽤 최소화

MultiTextWriter Writer = new MultiTextWriter(); 
StreamWriter sw1 = new StreamWriter(...); 
StreamWriter sw2 = new StreamWriter(...); 
Writer.AddWriter(sw1); 
Writer.AddWriter(sw2); 

Console.SetOut(Writer); 
Console.SetError(Writer); 

참고

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 
      } 
     } 
    } 
} 

그리고 그것을 사용하는 :

그래서 파생 TextWriter 클래스는 같을 것이다. 특히 개별 스트림을 닫는 코드를 추가해야합니다. 쓰기 오류를 어떻게 처리할지 결정해야합니다.

잠재적으로 더 나은 성능을 얻으려면 다른 TextWriter 쓰기 메서드를 재정의 할 수 있지만 Write(char) 메서드를 재정의하는 것으로 충분할 수 있습니다. 얼마나 많은 데이터가 전송되고 다른 목적지가 얼마나 많은지에 달려 있습니다.

0

출력을 MemoryStream으로 리디렉션하고 모니터링합니다 (주기 + 절전). 데이터가 도착하면 필요한 곳으로 보내십시오.

0

쓰기 만 지원하는 Stream 클래스에서 파생 된 CompositeStream 클래스를 만들 수 있습니다. 그리고 오버라이드 된 Write 메서드에서 임의의 수의 기본 스트림에 쓸 수 있습니다.

0

솔루션의 예 : 출력을 StreamWriter 및 다른 곳으로 반향시킬 TextWriter에서 파생 된 클래스를 작성하십시오.