2014-12-18 3 views
3

Java 응용 프로그램에서는 로깅을 위해 SLF4J + Logback을 사용합니다. 나는 DEBUG 수준의 개발 로깅을 사용하고 ERROR 수준의 프로덕션 환경 로깅을 사용합니다. 로그 수준에 관계없이 어떤 경우에도 로그인하려는 일부 메시지가 있습니다 (System.out.println("Some Message")과 유사하지만 로거 사용).SLF4J - 로그 수준에 관계없이 로깅

이것을 구현할 수있는 방법이 있습니까? 오류 또는 더 낮은 레벨을 사용할 수는 있지만, 수행하고자하는 것은 약간의 정보를 제공하는 것입니다. 따라서 logger.error("Some message");은 의미상으로 잘못되었으므로 오류가 아닙니다.

내 클래스/클래스에 대해 logback.xml에 다른 로거를 정의 할 수 있지만 편리하지 않습니다.

이것을 달성하는 올바른 방법은 무엇입니까?

+0

나는 그렇게 할 수 없다고 생각합니다. 메시지에 로그 수준을 지정해야하며 로그 수준이 해당 수준이나 높은 로그 수준으로 설정된 경우에만 표시됩니다. 어쨌든 로그를 남길 수는 없습니다. 앞에서 말했듯이, 가장 낮은 레벨 인 FATAL을 제외하고는 의미 상 올바르지 않습니다. – drublik

+0

라이브러리 등에서 악용 될 수 있기 때문에 그것이 잘못되었다는 것을 알고 있었고 로깅 프레임 워크는 쓸모가 없었습니다. 하지만 여전히 그런 종류의 기능이 필요합니다. "올바른"방법이 있어야합니다. –

+1

당신이 당신의 질문에 대답 한 것처럼 들립니다. Java 코드 내에서 WARN 수준의 일부 메시지를 기록하여 개발 중에 로그인되지만 프로덕션에서는 로그되지 않도록해야합니다. 항상 로그 할 다른 메시지입니다. 따라서 동일한 로거를 사용하는 경우 프로덕션 환경에서 최소한 ERROR 레벨로 로그해야합니다. 낮은 수준 (예 : ALL)으로 메시지를 기록하고 모든 환경에서 메시지를 표시하려면 다른 로거가 필요합니다. – palimpsestor

답변

1

SLF4J/Logback의 멋진 "마커"기능이 매우 유용합니다. 콘솔에 모든 경고/오류뿐만 아니라 특별한 "상태"메시지를 기록하려고한다고 가정 해보십시오. 당신은 클래스를 가질 수

은 다음과 같이 로그인을 수행합니다

public class MyClass { 
    private static final Marker status = MarkerFactory.getMarker("STATUS"); 
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class); 

    public void doSomething() { 
     logger.info(status, "Beginning"); 
     logger.info("Regular info log"); 
     logger.warn("Warning"); 
     logger.info(status, "Done"); 
    } 
} 

그런 다음, logback.xml, 당신은 모든 경고 메시지는 "상태"표시 보여 필터 : 기본적으로

<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> 
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> 
      <marker>STATUS</marker> 
     </evaluator> 
     <OnMatch>ACCEPT</OnMatch> 
     <OnMismatch>NEUTRAL</OnMismatch> 
    </filter> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>WARN</level> 
    </filter> 
    <encoder> 
     <pattern>${pattern}</pattern> 
    </encoder> 
</appender> 

을, 당신은 로거의 레벨을 DEBUG로 설정하여 의 모든 것이 appender로 이동 한 다음 appender에서 추가로 filtering을 사용하여 찾고있는 정확한 라인을 얻습니다. 서로 다른 클래스에 대해 로깅 수준을 다르게하려고하면 좀 더 까다로울 수 있지만 Logback은 필터가 많은 유연성을 제공합니다 (필요한 경우 사용자 고유의 필터를 만들 수도 있습니다).

+0

귀하의 제안에 심각한 문제가 있습니다. SLF4J의 마커는 끔찍하게 작동합니다. http://jira.qos.ch/browse/SLF4J-240에서 문제를 문서화합니다. 테스트에서 우리는 SLF4J BasicMarker를 사용하는 코드 (OnMarkerEvaluator가하는 방법)가 다른 필터보다 100-300 배 느린 코드를 작성했습니다. – rgoers

+0

@rgoers 성능 테스트를 수행하지 않았고 로깅이 성능 병목 현상이있는 경우가 없었지만 문제가 발생하면 평균 로깅 설정이 복잡해집니다. 마커는 하나 일 수 있습니다. 감사. –

+0

SLF4J-240은 오늘 수정되어 1.7.24 릴리스에 포함됩니다. – rgoers

관련 문제