채워진 메시지와 예외의 스택 추적을 모두 기록하는 올바른 방법은 무엇입니까?
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는 차이를 만드는 것입니다