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

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

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



답변

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 등)와 기본 프레임 워크 구성 방법에 따라 다릅니다. 그러나 마지막 매개 변수가 예외 인 경우 기본 프레임 워크에 관계없이 해석됩니다.


답변

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

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

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


답변