나는 그것을 제어하기 위해 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를 사용하여이 작업을 수행 할 수 있습니까?