log4net 문제를 추적하는 방법


191

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

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

답변:


294

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

<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 페이지 .


10
응용 프로그램이 실행중인 프로세스에 로깅 텍스트 파일을 만들려는 경로에 대한 권한이 있는지 확인하십시오 (위 예에서 "C : \ tmp \ log4net.txt")
NMrt

3
내부 디버깅에 타임 스탬프가없는 것 같습니다
snit80

4
에서 C:\tmp\log4net.txt로 변경 C:\log4net.txt하면 텍스트 파일을 생성 할 수 있습니다.
Frank Myat Thu

6
내가 재미있는 길을 찾았다는 메모. <configSections></configSections>아래의 첫 번째 항목 인지 확인하십시오 <configuration>. 그렇지 않으면 오류가 발생합니다.
Nick

2
로그 파일의 항목 시간은 표시되지 않습니다. 속성 traceOutputOptions="TimeStamp"과 태그 traceOutputOptions="DateTime"에서 설정을 시도했지만 add로그 파일 내용에서 아무것도 변경되지 않습니다. 누군가가 추적 로그 파일에 각 줄 / 항목의 시간을 표시하도록 log4net을 설정하는 방법을 알고 있습니까?
Ulysses Alves

43

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

<log4net debug="true">

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


6
이 플래그가 활성화되면 Visual Studio의 출력 창에서 log4net의 진단 로그를 볼 수 있습니다
Naren

24

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

log4net.Util.LogLog.InternalDebugging = true;

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


8

진입 점이있는 루트 응용 프로그램이 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이 올바르게 설정되었습니다.


1
:
costa

2

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


2

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.