log4j를 사용하여 서로 다른 콘텐츠의 여러 로그 파일 만들기


81

다른 어 펜더에 다른 수준의 로깅을 출력하도록 log4j를 구성하는 방법이 있습니까?

여러 로그 파일을 설정하려고합니다. 기본 로그 파일은 모든 클래스에 대한 모든 INFO 및 위 메시지를 포착합니다. (개발 중에는 모든 DEBUG 이상 메시지와 특정 클래스에 대한 TRACE를 포착합니다.)

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

내가 원하는 것을 얻을 수있는 방법이 있습니까?

고마워, 댄

java  log4j 

3
하나의 로그 파일이 DEBUG 만 캡처하고 DEBUG 만 캡처하고 다른 로그 파일은 INFO 및 INFO 만 캡처하도록 하시겠습니까?
Eddie

답변:


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

3
마지막 줄은 무엇을합니까?
djangofan

1
@djangofan은 사용자 정의 패키지 / 클래스 로그 수준 (예 : TRACE 로깅을 사용하는 com.yourpackage.yourclazz)을 설정하지만이 경우 이미 기본값 (1 행에 설정)이므로 아무 작업도 수행하지 않습니다. IMO이 예제는 rootLogger에 INFO가 있고 "yourclass"에 DEBUG가 있으면 더 좋습니다.
Tom Clift

첫 번째 줄의 매개 변수는 TRACE, QuietAppender, LoudAppender 여야합니다. QuietAppender, LoudAppender, TRACE
Richard Whitehead

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 메시지 만 포함됩니다.


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

1
@WowBow 둘 중 하나 일 수 있지만 이름이 패키지처럼 보입니다. 로거에 클래스 이름을 사용하는 것은 관례
일뿐입니다.

감사. 나는 내가 요청하고 둘 다 위해
일한

7

이 질문이 있었지만 반전이 있습니다. 다른 콘텐츠를 다른 파일에 기록하려고했습니다. 저수준 디버그 로그와 고수준 사용자 로그에 대한 정보가 있습니다. LowLevel은 하나의 파일로 이동하고 HighLevel은 파일과 syslogd 모두로 이동하기를 원했습니다.

내 솔루션은 3 개의 어 펜더를 구성한 다음 다음과 같이 로깅을 설정하는 것이 었습니다.

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

내가 알아 내기 어려웠던 부분은 'log4j.logger'에 여러 어 펜더가 나열 될 수 있다는 것입니다. 한 번에 한 줄씩하려고했습니다.

이것이 누군가에게 도움이되기를 바랍니다!


3

기본 로그 파일 / 어 펜더의 .Threshold = INFO경우 로거에 DEBUG, TRACE 등이 활성화되었는지 여부에 관계없이 어 펜더에 실제로 기록되는 내용을 INFO 이상으로 제한하도록 a 를 설정합니다 .

DEBUG를 잡는 것과 그 이상의 것은 ... 아마도 커스텀 어 펜더를 작성해야 할 것입니다.

그러나 문제 해결 및 분석을 매우 어렵게 만드는 것처럼 들리므로 이렇게하지 않는 것이 좋습니다.

  1. 문제를 해결할 수있는 단일 파일을 만드는 것이 목표 인 경우 로그 데이터를 여러 파일에 걸쳐 확장하는 것은 성 가실 것입니다. 매우 엄격한 로깅 정책이 없다면 DEBUG 및 INFO의 콘텐츠가 필요할 수 있습니다. 문제가있는 코드의 실행을 효과적으로 추적 할 수 있어야합니다.
  2. 모든 디버그 메시지를 계속 로깅하면 로깅 (방법)을 낮춤으로써 프로덕션 시스템에서 일반적으로 얻는 성능 향상을 잃게됩니다.

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

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

XML에서 다음과 같이 임계 값 매개 변수를 추가 할 수 있습니다. <appender name = "ERROR_FILE"> <param name = "Threshold"value = "ERROR"/> </ appender>
razor

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