[.net] log4net 문제를 추적하는 방법

나는 항상 log4net을 사용하지만, 내가 알지 못했던 한 가지는 내부에서 무슨 일이 일어나고 있는지 말하는 방법입니다. 예를 들어, 프로젝트에 콘솔 어 펜더와 데이터베이스 어 펜더가 있습니다. 데이터베이스와 코드를 약간 변경했는데 이제 데이터베이스 어 펜더가 더 이상 작동하지 않습니다. 결국에는 왜 그런지 알아낼 것이지만 log4net에서 무슨 일이 일어나고 있는지 볼 수 있다면 많은 도움이 될 것입니다.

log4net은 문제의 원인을 파악하기 위해 볼 수있는 모든 종류의 출력을 생성합니까?



답변

먼저 애플리케이션 구성 파일에서이 값을 설정해야합니다.

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

그런 다음 출력을 저장할 파일을 결정하기 위해 동일한 .config 파일에 다음 코드를 추가 할 수 있습니다.

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

‘log4net 내부 디버깅을 어떻게 활성화합니까?’에서 더 자세한 설명을 찾을 수 있습니다. 에서 log4net의 FAQ 페이지 .


답변

log4net 구성 파일을 사용하는 경우 최상위 노드를 다음과 같이 변경하여 디버깅을 켤 수도 있습니다.

<log4net debug="true">

구성을 다시로드하고 추적 리스너가 올바르게 설정되었다고 가정하면 작동합니다.


답변

위의 답변 외에도이 줄을 사용하여 c : \ tmp \ log4net.txt 출력 대신 실시간으로 로그를 볼 수 있습니다.

log4net.Util.LogLog.InternalDebugging = true;

예를 들어 콘솔 앱에서이를 추가 한 다음 실시간으로 출력을 볼 수 있습니다. 작은 테스트 장치에서 log4net을 디버깅하여 테스트중인 어 펜더로 무슨 일이 일어나고 있는지 확인하는 것이 좋습니다.


답변

진입 점이있는 루트 응용 프로그램이 log4net에 무언가를 기록하는지 확인하십시오. 다음 중 하나를 제공하십시오.

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

2.0.8에서는 흥미로운 상황이있었습니다. 라이브러리 프로젝트와 테스트 exe 프로젝트를 작성하여 기능을 시연했습니다. 라이브러리 프로젝트는 exe 프로젝트와 마찬가지로 Log4net을 사용하도록 설정되었습니다. exe 프로젝트는 assemblyinfo 속성을 사용하여 구성을 등록했지만 콘솔 또는 로그 파일에 로깅 출력을 얻지 못했습니다. log4net 내부 디버그 로깅을 켰을 때 콘솔에 일부 내부 메시지가 기록되었지만 여전히 정상적인 로그는 없습니다. 오류가보고되지 않았습니다. 위의 코드를 프로그램에 추가하면 모두 작동하기 시작했습니다. 그렇지 않으면 Log4net이 올바르게 설정되었습니다.


답변

내부 로그에 충분한 정보가 없으면 소스 코드 를 빌드하고 디버그하는 것이 매우 쉽습니다 . 이것을 개발 프로젝트와 혼합하지 않으려면 메시지를 기록하는 간단한 콘솔 응용 프로그램을 추가하고 프로젝트 log4net.config를이 응용 프로그램에 복사 한 다음 해당 클래스를 디버깅하십시오.


답변

log4net 2.0.8에서는 별도의 DLL에 log4net을 사용하여 로깅 할 수없는 것 같습니다. 이것을 시도하면 결과가 매우 이상합니다. 더 이상 로깅이 수행되지 않습니다. 디버그 옵션을 사용하여 log4net을 초기화하면 오류가 표시되지 않습니다.

K0D4가 말했듯이 메인 모듈에 log4net에 대한 참조가 있어야하며 프로그램 시작시 한 번 호출하면 모두 괜찮습니다.

다음 버전의 log4net에서는이 버그가 수정되었을 것입니다.


답변