2010-03-16 2 views
16

우리는 log4net을 사용하여 winform 응용 프로그램의 이벤트와 오류를 기록합니다. 고객이 응용 프로그램을 실행하는 동안 로그 파일을 확인하고 싶습니다. 그러나 log4net이 쓰기 (커밋) 작업을 수행하는시기와 방법을 찾을 수 없습니다. 그리고 혼자서 다른 로거를 만드는 경우를 제외하고 고객의 요구 사항을 충족시키는 방법. 도움이 되었습니까? 감사.log4net은 언제 로그를 파일에 쓰거나 커밋합니까?

+0

우리는 Windows Forms 응용 프로그램에서 log4net을 사용하고 있으며 이에 대해서는 문제가 없습니다. 이벤트와 파일 업데이트 사이에 약간의 대기 시간이 있지만 초 단위로 이야기합니다. 어쩌면 문제가 다른 곳에서 일어 났을 까? –

+1

예, 아마도 우리의 custormer의 문제는 두 번째 상황입니다. Peter는 MemoryAppender가이 문제를 해결할 것이라고 말했습니다. 감사합니다 모두, 특히 피터. 당신의 대답은 훨씬 더 도움이됩니다. – Jollian

답변

8

당신이 FileAppender를 사용하는 경우,이 펜더 차례로 ImmediateFlush 속성을 노출하는 TextWriterAppender을 상속합니다. 이 속성의 값은 기본적으로 true이며 appender가 각 추가 작업의 기본 스트림에서 Flush()을 수행하도록합니다.

고객이 로그 파일을 "모니터링하는"방법에 따라 응용 프로그램 내에서 모니터링 할 수 있도록하는 것이 좋습니다. 이 작업은 파일에 추가하는 것 외에도 the MemoryAppender을 사용하고 해당 appender에서 이벤트를 읽음으로써 수행 할 수 있습니다. 나는 당신의 보안 구성 및 구성로드의 구현에 따라, 응용 프로그램 풀을 회전 사용자가 쓰기 권한이 없을 수 있습니다, 즉는 SharePoint 인스턴스에서 log4net을 사용 할 때

-1

로그 파일에 관해서는 FileAppender 또는 파생 클래스를 사용하고있는 것 같습니다. 이것은 기본적으로 출력을 버퍼링합니다. 버퍼링 된 출력 훨씬 더 효율적이므로 귀하의 요구 사항을 충족하기 위해, 당신은 각 쓰기 작업 후 커밋을 강제로보다보기 전에 로그를 플러시하는 몇 가지 메커니즘을 제공하는 것이 좋습니다.

다음과 같은 코드를 사용하여이 작업을 수행 할 수 있습니다

foreach (IAppender appender in LogManager.GetRepository().GetAppenders()) 
{ 
    BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton; 
    if (b != null) b.Flush(); 
} 
+1

"기본적으로 출력을 버퍼링합니다." 사실이 아닙니다! FileAppender (더 구체적으로는 기본 클래스 TextWriterAppender)는 Append 작업을 수행 할 때마다 플러시됩니다. http://logging.apache.org/log4net/release/sdk/log4net.Appender.TextWriterAppender.ImmediateFlush.html 따라서 최신 로그 항목이 항상 즉시 파일에 기록되므로 아무 것도 할 필요가 없습니다 따라서 고객은 파일을 열 수 있습니다. – gehho

+1

@gehho가 맞습니다. FileAppender는 버퍼링하지 않습니다. 버퍼링을 담당하는 내장 어 펜더는 AdoNet-, BufferingForwarding-, Remoting- 및 SmtpXXX 어 펜더입니다. –

1

한 가지 내가 통지를했다 로컬 파일 시스템을 사용하여 로그 파일을 만듭니다.

이 때문에 올바른 자격 증명으로 구성을 호출해야하며, SharePoint에서는 높은 보안 컨텍스트에 있어야합니다. 완전히 관련이있는 것은 아니지만 문제가 될 수 있습니다.

0

this을 참조하십시오. 프로그램을 통해 log4net 로그를 프로그래밍 방식으로 플러시합니다. Joe의 대답은 약간 정확하지 않지만 대략 동일한 코드이므로 버퍼링 된 모든 appenders를 플러시 할 수 있습니다.

관련 문제