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

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

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

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

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

고마워, 댄



답변

시작해야합니다.

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


답변

아마도 이런 건가요?

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


답변

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

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

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

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

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


답변

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

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

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

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


답변

데모 링크 : https://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

내 솔루션은 spring-boot-starter-log4j. 예제는 사용하는 기본 예제 spring-boot-starter이며 두 Logger는 서로 다른 로그 파일에 기록합니다.


답변