UFO ET IT

log4j 두 번 로깅

ufoet 2020. 11. 19. 22:21
반응형

log4j 두 번 로깅


log4j를 사용하여 오류 및 기타 시스템 정보를 기록하고 있습니다. 그러나 정보 수준에서 두 번 기록 된 정보가 있습니다.

public static void main(final String... args) throws Exception {

    LOGGER.info("program started");
    try {
        // try body codes
    } catch (Exception ex) {
        LOGGER.info("program start-up failed.",ex);
    }
}

그러나 프로그램이 시작되거나 두 번 기록 된 정보가 실패하면 누구든지 그 이유를 찾을 수 있도록 도와 줄 수 있습니다.


두 어 펜더가 모두 구성되어있을 수 있으므로 메시지가 루트 로거에 의해 한 번 기록되고 특정 로거에 의해 다시 기록되는 것처럼 보입니다 (속성 파일과 코드에서 다른 위치에있을 수 있음).

이 문제는 로거에서 additivity 를 false 로 설정하여 해결할 수 있습니다 . Log4j 매뉴얼 은 Appenders and Layout 섹션에서 부가 성을 언급합니다.


아틀란티스와 동의하십시오.

log4j.rootCategory=INFO, console
log4j.logger.org.hibernate=INFO

위의 속성 설정은 이중 로깅을 발생시킵니다.

그러나 추가

log4j.additivity.org.hibernate=false

문제를 해결했습니다.

이 책의 62 페이지를 확인하십시오. http://books.google.com/books?id=hZBimlxiyAcC&printsec=frontcover#v=onepage&q&f=false


XML 형식을 사용하는 경우 :

<logger name="package.class" additivity="false">
    <level value="info" />
    <appender-ref ref="file" />
    <appender-ref ref="console" />
</logger>

참고 : 기본적으로 로거는 가산 성 플래그가 true로 설정되어 있습니다.


간단히 추가

logger.setadditivity(false);

귀하의 코드 ( 참조 ).

우리는 콘솔에서 두 배의 결과를 얻었습니다. 어 펜더는 싱글 톤이 아니기 때문입니다. 즉, 범주는 조상으로부터 모든 어 펜더를 상속합니다 (기본값). 범주에 appender를 추가하고 다른 appender와 동일한 기본 스트림 (콘솔, 동일한 파일 등)에 쓰면 동일한 로그 메시지가 로그에 두 번 (또는 그 이상) 나타납니다. 또한 계층 구조의 두 범주가 동일한 어 펜더 이름을 사용하도록 구성된 경우 Log4j는 해당 어 펜더에 두 번 기록합니다. 해당 카테고리에 대해 구성됨


Java 디버거로 프로그램을 실행할 수있는 경우 이러한 이중 로깅 호출 중 하나가 발생하는 프로그램에 중단 점을 두십시오.

디버거에서 로거 개체를 검사합니다. org.apache.log4j.Logger (v 1.2.x) 인 경우 AppenderAttachableImpl이있을 수 있습니다. AppenderAttachableImpl에서 추가 자 목록을 쿼리 할 수 ​​있습니다.

어 펜더가 두 개 이상인 경우 문제가 될 수 있으며이를 수정하는 단서가 될 수 있습니다.


additivity속성 을 조정하는 잠재적 인 대안 은 가장 구체적인 것부터 가장 일반적인 것까지 로거를 검사하는 것입니다. 다음 예에서는 foo.bar.LoggingExampleClass에서 발생하는 모든 로그 이벤트에 대해 콘솔에서 이중 로깅을 볼 것으로 예상합니다. foo.bar.LoggingExampleClass 로거에서 추가 콘솔 어 펜더를 제거하는 것이 안전합니다. 이미 루트 로거에 포함되어 있기 때문입니다.

<Logger name="foo.bar.LoggingExampleClass" level="DEBUG">
  <AppenderRef ref="Console" />   <!-- THIS APPENDER COULD BE REMOVED -->
  <AppenderRef ref="FooBarPackageLogging" />
</Logger>

<Root level="WARN">
  <AppenderRef ref="Console" />
  <AppenderRef ref="MainLogFile" />
</Root>

There are tradeoffs to both the additivity adjustment approach and the appender adjustment approach. Turning off additivity might inadvertently stop a desirable generic level logger's appender from being used. In the above example, setting the additivity="false" property on the foo.bar.LoggingExampleClass Logger would mean the logging event would not be appended to the MainLogFile referenced in the Root logger.

On the other hand, relying on parent appenders might be problematic if the parent appenders are changed without examining the effects on more granular loggers. For example, suppose there is a requirement that foo.bar.LoggingExampleClass logging events should be written to the Console. They currently are in the example configuration above due to additivity, even if the foo.bar.LoggingExampleClass Logger's Console appender is removed. However, if the Console appender was also removed from the Root logger without any additional adjustments, the requirement would no longer be met.


I had the same problem, and fixed by removing all appenders from the root logger. I don't know why, but solve my problem and I'm sharing:

        // Root
    rootLogger = Logger.getRootLogger();
    rootLogger.removeAllAppenders(); // Solve my problem
        // CSV
    csvLogger = rootLogger.getLogger("csvLogger");
        // Txt
    txtLogger = rootLogger.getLogger("txtLogger");

Without this extra line, even setting additivity to false, whenever I log with my csvLogger or txtLogger it logs twice.


In your resources/log4.properties file.

In that configuration file, if you have "log4j.rootLogger= DEBUG, file", then don't include "log4j.logger.org.springframework=DEBUG, file". Just keep the log4j.rootLogger part.

참고URL : https://stackoverflow.com/questions/5699309/log4j-logging-twice

반응형