2017-10-17 19 views
0

私は、Windowsサービスとそれを制御するシステムトレイアプリケーションを作成しています。私のサービスでは、たくさんのlog4netロギングステートメントがあります。私は、これらのメッセージをsystrayアプリケーションから開くことができるウィンドウに表示し、log4net TraceAppenderを試し始めました。私はまた、私のシステムトレイアプリケーションにカスタムTraceListenerを追加しました。残念ながら、私はシストレーアプリケーションでは何のメッセージも入ってこない。私は、他のアプリケーションでこれらのメッセージを受信することさえ可能であるとは確信していません。私のサービスで別のアプリケーションでTraceAppenderから送信されたlog4netメッセージを受信する

私はlog4net.xmlに次の行を追加しました:

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

をルートセクションで、私はこれらの線に持っているので、私はまた、ファイルアペンダを使用しています:

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

をメッセージはログファイルに届きます。システムトレイのアプリで

、私は次のクラスを追加しました:

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

2つのプロセスがあります。 log4netとTraceAppenderを使用してWindowsサービスでTrace.WriteLineを実行している。 2番目のプロセスでは、システムトレイで実行されているアプリケーションで、カスタムTraceListener経由でリッスンしています。

Trace.WriteLineはブロードキャストではないため、すべてのプロセスがそれを受信できます。あなたのコードを修正する方法は、システムトレーアプリケーションにあり、Windowsサービスプロセスによって生成されたログファイルを監視するFileSystemWatcherを追加します。ログファイルが更新されるたびに、新しい値をシステムトレイアプリケーションに読み込んで表示します。ログファイルを開くときは、排他的にファイルアクセスを使用しないでください。

関連する問題