programing

로그백 JsonLayout이 모든 로그를 같은 줄에 인쇄합니다.

i4 2023. 3. 17. 19:36
반응형

로그백 JsonLayout이 모든 로그를 같은 줄에 인쇄합니다.

Json Layout과 Spring Boot을 사용하여 메시지를 JSON 형식으로 기록하고 있습니다.로그 메시지는 콘솔에만 기록하고 로그 파일에는 기록하지 않습니다.

JSON 로그가 같은 행에 연속적으로 기록되어 있는 것을 알 수 있습니다.로그는 로그 애그리게이터로 발송되므로 생산 시에는 문제 없습니다.그러나 이것은 지역 발전에 대해 분석하기가 조금 어려워진다.

로그

{"timestamp":"2016-11-13 23:06:17.727","level":"INFO","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Info log:: printme 1","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"DEBUG","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Debug log:: printme","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"WARN","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Warn log:: printme","context":"default"}{"timestamp":"2016-11-13 23:06:17.727","level":"ERROR","thread":"qtp745835029-19","logger":"com.test.controller.TestController","message":"Error log:: printme","context":"default"}

다음은 로그백 설정입니다.
logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
            <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                <prettyPrint>false</prettyPrint>
            </jsonFormatter>
            <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        </layout>
    </appender>
    <logger name="jsonLogger" additivity="false" level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>
</configuration>

콘솔의 다른 행에 기록되도록 설정에 뭔가 누락되어 있지 않습니까?

도와주셔서 감사합니다.

설정해야 합니다.appendLineSeparator할 수 있는 선택권true위해서ch.qos.logback.contrib.json.classic.JsonLayout이 예:

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter" />
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        <appendLineSeparator>true</appendLineSeparator>
    </layout>
</appender>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

pretty print를 true로 설정하는 것도 하나의 솔루션입니다.그러나 클라우드 워치와 같은 서비스로 스트리밍할 때처럼 로그가 한 줄에 필요한 경우도 있습니다.레이아웃에 다음 추가

<appendLineSeparator>true</appendLineSeparator>

답변은 @mvnm에서 잘 받았습니다.만약을 위해, 예쁜 인쇄와 새로운 라인 세퍼레이터가 필요한 경우, 다음과 같은 구성을 사용할 수 있습니다.

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
            <prettyPrint>true</prettyPrint>
        </jsonFormatter>
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
        <appendLineSeparator>true</appendLineSeparator>
    </layout>
</appender>

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

JSONLAYout으로 문제가 발생하지 않은 logstah-logback-encoder로 전환했습니다.

다음과 같이 Spring Boot 응용 프로그램(또는 JSON 로그 파일)의 출력을 jq에 파이프합니다.

java -jar target/myapp.jar | jq -R 'fromjson?'

이것에 의해, 애플리케이션의 출력을 추종하는, 컬러 하이라이트 된 예쁜 인쇄의 json이 완성됩니다.JSON이 아닌 어플리케이션의 출력은 모두 무시됩니다(Spring Boot 배너 등).

jq 의 필터를 사용하면, INFO 레벨의 메시지 출력만을 표시할 수 있습니다.

java -jar target/myapp.jar | jq -c -R 'fromjson? | select(.level="INFO") | {message}'

또는 필터를 사용하여 표시하지 않을 키를 제거할 수 있습니다.

java -jar target/myapp.jar | jq -c -R 'fromjson? | del(.timestamp,.thread)'

Edited : pretty Print 를 true 로 변경해 보겠습니다.-><prettyPrint>true</prettyPrint>

로그를 2회 쓰고 있습니다.consoleAppender

   <logger name="jsonLogger" additivity="false" level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </logger>
    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
    </root>

로 바꾸다.

<logger name="jsonLogger" additivity="false" level="DEBUG"/>
<root level="INFO">
    <appender-ref ref="consoleAppender"/>
</root>

언급URL : https://stackoverflow.com/questions/40576959/logback-jsonlayout-printing-all-logs-on-the-same-line

반응형