2014-04-17 1 views
0

Log4j2와 해당 JSONLayout을 사용하여 JSON 형식의 로그를 생성합니다. 모든 것이 잘 작동하지만, 내가 좋아하는 Logger.warn(String message, Throwable t) 사용할 때 :Log4j2 JSON 레이아웃 : " n"(개행 문자) 처리

l4j2Logger.warn("log1...\n...log2", new Exception("ex1...\n...ex2")); 

내 로그에 얻을 다음 message 키에서

"message":"log1...\n...log2", 
"throwable":"java.lang.Exception: ex1...\\n...ex2\\n\tat test.Test.log(Test.java:73)\\n\tat......" 

에서, \n 문자가 로그 파일에 \n 기록,
하지만, throwable 키에서 \n 문자는 로그 파일에 \\n으로 기록됩니다.

이러한 로그를 구문 분석해야하므로 JSON 파서는 JSON specifications\n이 사용되어야한다는 것을 나타 내기 때문에 정상적인 것처럼 보이는 \\n을 좋아하지 않습니다. 여기

내 log4j에 XML 구성 파일의 추출물 :
<Appenders> 
    <File name="FileAppender" fileName="log4j2.log" append="true"> 
     <JSONLayout complete="true" compact="false"/> 
    </File> 
</Appenders> 

이 Log4j2이 throwable\\n을 사용하는 이유를 알고 있습니까, 그리고 경우/I는 어떻게 변경할 수 있습니까? (현재 Log4j-2.0-RC1을 사용하고 있습니다.)

답변

-1

먼저 로그 파일 해석에주의하십시오. 로그 파일을 인쇄하는 것은 무엇이든 이스케이프 시퀀스를 삽입 할 수 있습니다.

JSON 문서에서 문자열을 구문 분석하는 동안 \ n은 개행 문자로 바뀝니다. \ n은 완벽하게 합법적입니다 : \ 문자가 하나의 \로 대체되고 일반 n이 생깁니다. 따라서 개행 문자가있는 문자열 대신 백 슬래시 문자와 파서가 전달한 n 문자가있는 문자열을 얻습니다. 파서는 문제가 없어야합니다.

l4j2Logger.warn에서 줄 바꿈 문자가 포함 된 두 개의 문자열을 사용합니다. JSON 문서에서 "message"는 첫 번째 인수를 나타내는 문자열 값을 가진 것으로 보입니다. "throwable"값은 소스 코드를 나타내는 문자열 값을가집니다. 로그 파일의 행은 다음과 같습니다이 내가 도구가 이러한 로그 파일을 읽을을 확인할 것

java.lang.Exception: ex1...\n...ex2\n at test.Test.log(Test.java:73)\n at......" 

문자열로 구문 분석됩니다

"throwable":"java.lang.Exception: ex1...\\n...ex2\\n\tat test.Test.log(Test.java:73)\\n\tat......" 

; 이것은 의도 된 것으로 보인다.

+0

실제로 \\ n은 '\ n'으로 구문 분석됩니다. JSON 구문 분석기의 명목상의 동작입니다. 그러나 요점은 log4j2가'message' 필드처럼'\ n' 대신'\\ n'을 사용하는 이유입니까? 예상되는 로그 파일은'message'와'throwable' 필드 모두에 새로운 줄 문자를 만들어야합니다 ... 그렇지 않으면'throwable '의 스택 추적을 완전히 읽을 수 없습니다 – xav

+0

http : //www.json으로 이것을 분석하려고했습니다. org/java/index.html과 새로운 라인은'message' 필드에는 출력되지만'throwable' 필드에는 출력되지 않습니다 ('\ n' 문자열 만) – xav