2009-04-08 6 views
80

log4j를 구성하여 다른 어 펜더에 다른 로깅 레벨을 출력하도록 설정하는 방법이 있습니까?log4j로 다른 내용의 여러 로그 파일 만들기

여러 로그 파일을 설정하려고합니다. 기본 로그 파일은 모든 클래스의 모든 INFO 및 위의 메시지를 catch합니다. (개발 중에는 모든 디버그와 그 이상의 메시지를 잡을 것이고, 특정 클래스에 대해서는 TRACE를 잡을 것입니다.)

그런 다음 별도의 로그 파일을 갖고 싶습니다. 이 로그 파일은 클래스의 특정 서브 세트에 대한 모든 DEBUG 메세지를 포착하고 다른 클래스에 대한 모든 메세지를 무시합니다.

내가 나중에 무엇을 얻을 수있는 방법이 있습니까?

감사, 주요 로그 파일/펜더를 들어 댄

+3

하나의 로그 파일에서 DEBUG를 캡처하고 DEBUG 만 캡처하고 INFO를 캡처하는 다른 로그 파일 등을 원한다는 의미입니까? – Eddie

답변

3

는 여부에 관계없이 로거가 DEBUG, TRACE 등의, 위의 사실 정보에 펜더에 기록을 제한하는 .Threshold = INFO을 설정하고 , 활성화 됨.

DEBUG를 잡는 것과 그 이상은 ... 아마도 사용자 정의 appender를 작성해야 할 것입니다.

그것이 매우 어려운 문제 해결 및 분석을 만들 것처럼 소리 나는없는이 일을 권하고 싶습니다 그러나 :

  1. 당신의 목표는 당신이 뭔가를 해결하기 위해 볼 수있는 다음, 하나의 파일을 가지고있는 경우 로그 데이터를 여러 파일에 걸쳐 저장하는 것은 짜증나게됩니다. 로깅 정책이 매우 정교하지 않으면 문제 코드의 실행을 효과적으로 추적 할 수 있도록 DEBUG 및 INFO의 내용이 필요할 수 있습니다.
  2. 여전히 모든 디버그 메시지를 로깅하면 프로덕션 시스템에서 일반적으로 얻는 성능상의 이점을 잃어 가고 있습니다.
+0

나는 나의 목표를 더 잘 설명해야했다. 주요 로그는 오류, 비정상적인 조건 등을 추적하기위한 것입니다.앱의 어느 위치에서나 -이 로그는 작게 유지해야하므로 정기적으로 롤오버됩니다. 특수 로그는 하나의 하위 시스템의 동작을 추적하며 오랜 시간 동안 보관해야합니다. –

+0

두 번째 로그 파일에서 ERROR, WARN, INFO 메시지를 제외 하시겠습니까? –

+0

및 XML에서이 같은 매개 변수 임계 값을 추가 할 수 있습니다 <펜더 이름 = "ERROR_FILE"> <매개 변수 이름 = "임계 값"값 = "ERROR"/> – razor

70

이것은 당신이 시작할 수 있어야합니다 같은

log4j.rootLogger=QuietAppender, LoudAppender, TRACE 
# setup A1 
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.QuietAppender.Threshold=INFO 
log4j.appender.QuietAppender.File=quiet.log 
... 


# setup A2 
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.LoudAppender.Threshold=DEBUG 
log4j.appender.LoudAppender.File=loud.log 
... 

log4j.logger.com.yourpackage.yourclazz=TRACE 
+6

가 투표,하지만 오타가 라인 4에있다 : log4j.appender.LoudAppender.Threshhold = 정보는 log4j.appender.QuierAppender.Threshhold = INFO 여야합니다. – Olivier

+0

네, 맞습니다. 난 그냥 의사와 독서를 테스트하지 않았다;) – jasonnerothin

+0

일부 편집자? 편집자가 필요해? Daniel, 작업 답변을 확인할 수 있습니까? – enguerran

26

아마도 뭔가를?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
<!-- general application log --> 
<appender name="MainLogFile" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="server.log" /> 
    <param name="Threshold" value="INFO" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/> 
    </layout> 
</appender> 
<!-- additional fooSystem logging --> 
<appender name="FooLogFile" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="foo.log" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/> 
    </layout> 
</appender> 
<!-- foo logging --> 
<logger name="com.example.foo"> 
    <level value="DEBUG"/> 
    <appender-ref ref="FooLogFile"/> 
</logger> 
<!-- default logging --> 
<root> 
    <level value="INFO"/> 
    <appender-ref ref="MainLogFile"/> 
</root> 
</log4j:configuration> 

따라서 모든 정보 메시지는 server.log에 기록됩니다. 반대로 foo.log에는 디버그 수준의 메시지를 포함하여 com.example.foo 메시지 만 포함되어 있습니다.

+0

com.example.foo는 패키지 또는 클래스입니까? – WowBow

+1

@WowBow 둘 중 하나 일 수도 있지만, 패키지처럼 보이는 이름을 가지고 있습니다. 로거에 대한 클래스 이름 사용은 단지 규칙 일뿐입니다. – araqnid

+0

감사합니다. 내가 물었고 둘 다 위해 일한 후에 나는 둘 다 시도했다;) – WowBow

7

나는이 질문이 있었지만, 왜곡되어서 - 다른 파일에 다른 내용을 기록하려고했습니다. LowLevel 디버그 로그와 HighLevel 사용자 로그에 대한 정보를 가지고있었습니다. LowLevel은 하나의 파일에만, HighLevel은 파일과 syslogd 모두로 이동하기를 원했습니다.

내 솔루션은 3 펜더를 구성했고,이 같은 다음 설치 로깅 : 나를 파악하기 어려웠다

log4j.threshold=ALL 
log4j.rootLogger=,LowLogger 

log4j.logger.HighLevel=ALL,Syslog,HighLogger 
log4j.additivity.HighLevel=false 

부분은 'log4j.logger는'여러 펜더를 가질 수 있다고했다 나열되어 있습니다. 한 번에 한 줄 씩하려고했습니다.

누군가가 도움이 되었기를 바랍니다.