slf4j : 형식화 된 메시지, 오브젝트 배열, 예외를 로그하는 방법


275

채워진 메시지와 예외의 스택 추적을 모두 기록하는 올바른 방법은 무엇입니까?

logger.error(
    "\ncontext info one two three: {} {} {}\n",
    new Object[] {"1", "2", "3"},
    new Exception("something went wrong"));

다음과 비슷한 출력을 생성하고 싶습니다.

context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...

slf4j 버전 1.6.1


3
slf4j가 표준 % s 스타일 대신 자체 형식 문자열 구문을 사용하는 이유를 이해하지 못합니다. 성가신.
Keith Tyler

@KeithTyler 나는 {}맛의 문제를 더 좋아합니다 ...
Betlista

@KeithTyler toString()인수 의 방법은 비쌀 수 있습니다. 이 구문을 사용하면 각 객체에 대한 참조 만 전달되고 toString()특정 메시지가 실제로 기록되는 경우에만 메소드가 호출됩니다. info()로그 호출 에서 참조되는 개체 toString()는 로그 수준 WARN이상인 경우 해당 메서드를 호출 하지 않습니다 . {}구문이가 아니라는 것을 사용자에게 상기시켜 String.format()-like 작동, 그들은 그 목적이 아닌 문자열 표현을 통과해야 즉.
user149408

답변:


427

SLF4J 1.6.0부터 여러 매개 변수가 존재하고 로깅 명령문의 마지막 인수가 예외 인 경우 SLF4J는 사용자가 마지막 인수를 단순 매개 변수가 아닌 예외로 처리하기를 원한다고 가정합니다. 관련 FAQ 항목 도 참조하십시오 .

따라서 쓰기 (SLF4J 버전 1.7.x 이상)

 logger.error("one two three: {} {} {}", "a", "b", 
              "c", new Exception("something went wrong"));

또는 쓰기 (SLF4J 버전 1.6.x에서)

 logger.error("one two three: {} {} {}", new Object[] {"a", "b", 
              "c", new Exception("something went wrong")});

생산할 것이다

one two three: a b c
java.lang.Exception: something went wrong
    at Example.main(Example.java:13)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at ...

정확한 결과는 기본 프레임 워크 (예 : logback, log4j 등)와 기본 프레임 워크 구성 방법에 따라 다릅니다. 그러나 마지막 매개 변수가 예외 인 경우 기본 프레임 워크에 관계없이 해석됩니다.


4
어떤 기본 로깅 프레임 워크를 사용하고 있습니까? 위의 답변에서 언급했듯이 마지막 매개 변수가 예외 인 경우 기본 프레임 워크에 관계없이 해석됩니다. (로그 백, slf4j-log4j12, slf4j-jdk14 및 slf4j-simple으로 테스트되었습니다.)
Ceki

3
죄송합니다, 귀하의 예에서 형식 문자열에 n = 3 자리 표시자를 사용하고 객체 배열에 n + 1 = 4 요소를 사용했음을 인식하지 못했습니다. 형식 문자열에 n 개의 자리 표시자가 있고 객체 배열에 n 개의 요소와 세 번째 매개 변수로 예외가있었습니다. 내 기대는 예외가 stacktrace와 함께 인쇄 될 것이지만 결코 일어나지 않았다는 것입니다. 이것은 설계된대로 작동합니까? 또한 객체 배열에 n 개의 자리 표시 자와 n 개의 요소가 있고 마지막 요소가 예외 인 경우 스택 추적이 표시되지 않습니다. 배열에 n + 1 개의 객체가있는 n 개의 자리 표시자를 좀 더 강조해야 할 수도 있습니다.
rowe

7
나는 @Ceki가 Javadocs에 있지는 않지만 Loggerjavadoc 클래스 의 최상위에 있다는 것에 어려움을 겪었습니다
Adam Gent

1
개선 요청을 만들었 습니다. 원하는 경우 투표 할 수 있습니다.
Betlista

8

@Ceki의 답변 외에도 logback을 사용하고 프로젝트에서 구성 파일 (일반적으로 logback.xml)을 설정하는 경우 스택 추적 및 플롯 추적을 플롯하기 위해 로그를 정의 할 수 있습니다

<encoder>
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder>

패턴의 % ex는 차이를 만드는 것입니다

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