log4net으로 추적 메시지를 기록하는 방법은 무엇입니까?
log4net을 사용하여 로그 메시지를 롤링 로그 파일에 기록하고 있습니다.
이제 모든 추적 메시지 System.Diagnostics.Trace
를 해당 로그 파일로 리디렉션 합니다. 어떻게 구성 할 수 있습니까? 나는 log4net 문서에서 그것에 대해 무엇이든 찾으려고했지만 성공하지 못했습니다. 전혀 가능합니까?
그렇게하고 싶은 이유는 타사 라이브러리의 Trace 메시지에 관심이 있기 때문입니다.
<log4net>
<appender name="R1" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\MyService.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="10" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
Rune의 제안에 따라 log4net에 출력하는 기본 TraceListener를 구현했습니다.
public class Log4netTraceListener : System.Diagnostics.TraceListener
{
private readonly log4net.ILog _log;
public Log4netTraceListener()
{
_log = log4net.LogManager.GetLogger("System.Diagnostics.Redirection");
}
public Log4netTraceListener(log4net.ILog log)
{
_log = log;
}
public override void Write(string message)
{
if (_log != null)
{
_log.Debug(message);
}
}
public override void WriteLine(string message)
{
if (_log != null)
{
_log.Debug(message);
}
}
}
log4net이이를 지원하는지는 모르겠지만이를 수행 한 자체 추적 리스너를 구현할 수 있습니다.
TraceListener에는 구현해야 할 메서드가 너무 많지 않으며 값을 log4net에 전달하기 만하면됩니다.
To add a custom trace listener you would either modify your app.config/web.config or you would add it in code using Trace.Listeners.Add(new Log4NetTraceListener());
As per the answers above, there's an implementation here (this link is flaky, but I did find the source code):
https://code.google.com/archive/p/cavity/
To crudely deal with the issue (described in the comments to a previous answer) of internal log4net trace issuing from the LogLog class, I checked for this class being the source of the trace by inspecting the stack frame (which this implementation did already) and ignoring those trace messages:
public override void WriteLine(object o, string category)
{
// hack to prevent log4nets own diagnostic trace getting fed back
var method = GetTracingStackFrame(new StackTrace()).GetMethod();
var declaringType = method.DeclaringType;
if (declaringType == typeof(LogLog))
{
return;
}
/* rest of method writes to log4net */
}
Using a TraceAppender will still create the problems described in the comments above.
Thanks,
I went with Dirk's answer slimmed down a bit.
public class Log4netTraceListener : System.Diagnostics.TraceListener
{
private readonly log4net.ILog _log;
public Log4netTraceListener()
: this(log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType))
{
}
public Log4netTraceListener(log4net.ILog log)
{
_log = log;
}
public override void Write(string message) => _log?.Debug(message);
public override void WriteLine(string message) => _log?.Debug(message);
}
참고URL : https://stackoverflow.com/questions/515381/how-to-log-trace-messages-with-log4net
'code' 카테고리의 다른 글
Gradle 프로젝트의 Maven 아티팩트 ID를 어떻게 설정합니까? (0) | 2020.10.30 |
---|---|
componentWillUnmount에서 가져 오기를 취소하는 방법 (0) | 2020.10.30 |
Android에서 내 애플리케이션 이름 지정 (0) | 2020.10.30 |
timeIntervalSinceDate는 어떤 시간 단위를 반환합니까? (0) | 2020.10.30 |
Eclipse 탭 재배치 (0) | 2020.10.30 |