2017-10-17 4 views
0

나는 그것을 제어하기 위해 Windows 서비스와 시스템 트레이 응용 프로그램을 작성 중입니다. 제 서비스에는 log4net 로깅 문이 많이 있습니다. 이 메시지를 시스템 트레이 응용 프로그램에서 열 수있는 창에 표시하고 log4net TraceAppender를 시험하기 시작했습니다. 또한 사용자 정의 TraceListener를 내 시스템 트레이 응용 프로그램에 추가했습니다. 불행히도, 시스템 트레이 응용 프로그램에서 들어오는 메시지가 보이지 않습니다. 다른 응용 프로그램에서 이러한 메시지를 수신하는 것이 가능한지 확신 할 수 없습니다. 내 서비스에서 다른 응용 프로그램에서 TraceAppender가 보낸 log4net 메시지 받기

나는 나의 log4net.xml에 다음 줄을 추가 :

<root> 
    <level value="WARN" /> 
    <appender-ref ref="RollingFileAppender" /> 
    <appender-ref ref="TraceAppender" /> 
</root> 

:

<appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <immediateFlush value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

가 나는 또한 파일 어 펜더를 사용하고 나는이 라인을 가지고 루트 섹션 있도록 메시지는 로그 파일에 도착합니다. 내가 생성자가 발견 될 수 있다는 예외를 얻었 기 때문에 인수없이

class TextBoxTraceListener : TraceListener 
{ 
    private static TextBox _target; 
    private StringSendDelegate _invokeWrite; 

    public TextBoxTraceListener() 
    { 
    } 

    public TextBoxTraceListener(TextBox target) 
    { 
     _target = target; 
     _invokeWrite = new StringSendDelegate(SendString); 
    } 

    public override void Write(string message) 
    { 
     if (_target != null) 
     { 
      _target.Invoke(_invokeWrite, new object[] { message }); 
     } 
    } 

    public override void WriteLine(string message) 
    { 
     if (_target != null) 
     { 
      _target.Invoke(_invokeWrite, new object[] 
      { message + Environment.NewLine }); 
     } 
    } 

    private delegate void StringSendDelegate(string message); 
    private void SendString(string message) 
    { 
     // No need to lock text box as this function will only 
     // ever be executed from the UI thread 
     _target.Text += message; 
    } 
} 

내가 생성자를 추가 : 시스템 트레이 응용 프로그램에서

, 나는 다음과 같은 클래스를 추가했다.

내 대화 클래스 (윈폼)에 대한 코드는 이것이다 :

public partial class LogWatcherForm : Form 
{ 
    TextBoxTraceListener _textBoxListener; 

    public LogWatcherForm() 
    { 
     InitializeComponent(); 
    } 

    private void LogWatcherForm_Load(object sender, EventArgs e) 
    { 
     _textBoxListener = new TextBoxTraceListener(logTextBox); 
     Trace.Listeners.Add((TraceListener)_textBoxListener); 
    } 
} 

그리고 마지막으로, 시스템 트레이 응용 프로그램의 app.config에 포함 :

<system.diagnostics> 
    <trace autoflush="false" indentsize="4"> 
    <listeners> 
     <add name="myListener" type="Cordis.ServiceSysTray.TextBoxTraceListener,ServiceSysTray"/> 
     <remove name="Default" /> 
    </listeners> 
    </trace> 
</system.diagnostics> 

나는 누군가가 날 지점 수 있기를 바랍니다 이 작업을 제대로 수행하려면 올바른 방향으로 TraceAppender를 사용하여이 작업을 수행 할 수 있습니까?

답변

0

두 가지 프로세스가 있습니다. log4net 및 TraceAppender를 사용하여 Windows 서비스에서 Trace.WriteLine을 수행합니다. 두 번째 프로세스에서 시스템 트레이에서 실행중인 응용 프로그램은 사용자 정의 TraceListener를 통해 수신 대기합니다.

Trace.WriteLine은 모든 프로세스에서받을 수 있도록 브로드 캐스트되지 않습니다. 코드를 수정하는 방법은 시스템 트레이 응용 프로그램에 있으며 FileSystemWatcher를 추가하면 Windows 서비스 프로세스에서 생성 된 로그 파일을 모니터링합니다. 로그 파일이 업데이트 될 때마다 시스템 트레이 응용 프로그램에 새 값을 읽어서 표시합니다. 로그 파일을 열 때 독점적으로 파일 액세스를 사용하지 않도록하십시오.