如何將Spring Boot應用中日誌輸出格式改為JSON?-DEV

banq發表於2020-09-19

今天,我們有了一類稱為日誌聚合系統的應用程式。當我們擁有大量微服務並且我們希望跨微服務跟蹤日誌時,日誌聚合很有用。
傳統的Java應用程式日誌如下所示:

2020-09-17 21:56:10.740  INFO [Orders:restartedMain::] o.s.b.w.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''


使用下面方法對日誌進行搜尋:

cat application.log | grep <your-search>


有人想出了這種不同的方法,為什麼在主要用於搜尋時為什麼不以更可搜尋的格式儲存日誌。JSON碰巧很容易被搜尋到,從而進行JSON日誌記錄。另一種引用方式是結構化日誌,因為日誌具有定義明確的結構,以後可以用來搜尋。
以JSON格式顯示的相同應用程式日誌如下所示:

{
  "@timestamp": "2020-06-17T14:41:11.174-04:00",
  "@version": "1",
  "message": "Tomcat initialized with port(s): 8080 (http)",
  "logger_name": "org.springframework.boot.web.embedded.tomcat.TomcatWebServer",
  "thread_name": "restartedMain",
  "level": "INFO",
  "level_value": 20000
}

 
要以JSON格式記錄日誌,需要包含2個依賴項。如果您使用maven進行依賴性管理,則將包括以下依賴性

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.4</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

在這裡,我們使用的是logstash-logback-encoder
然後,我們可以使用以下程式碼段將json編碼器配置為logback

<encoder class="net.logstash.logback.encoder.LogstashEncoder">
    <providers>
        <timestamp>
            <timeZone>EST</timeZone>
        </timestamp>
        <pattern>
            <pattern>
                {
                "level": "%level",
                "service": "orders",
                "traceId": "%X{X-B3-TraceId:-}",
                "spanId": "%X{X-B3-SpanId:-}",
                "thread": "%thread",
                "class": "%logger{40}",
                "message": "%message"
                }
            </pattern>
        </pattern>
        <stackTrace>
            <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                <maxDepthPerThrowable>30</maxDepthPerThrowable>
                <maxLength>2048</maxLength>
                <shortenedClassNameLength>20</shortenedClassNameLength>
                <rootCauseFirst>true</rootCauseFirst>
            </throwableConverter>
        </stackTrace>
    </providers>
</encoder>

因此,讓我們假設您想將資料作為傳統日誌記錄到控制檯,並將它們作為json記錄到檔案,我們可以如下配置logback xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/console.xml"/>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [Orders:%thread:%X{X-B3-TraceId}:%X{X-B3-SpanId}] %logger{40} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="fileout"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>./logs/orders.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <maxIndex>8</maxIndex>
            <FileNamePattern>./logs/orders.log.%i
            </FileNamePattern>
        </rollingPolicy>
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>128MB</MaxFileSize>
        </triggeringPolicy>

        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <providers>
                <timestamp>
                    <timeZone>EST</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "level": "%level",
                        "service": "orders",
                        "traceId": "%X{X-B3-TraceId:-}",
                        "spanId": "%X{X-B3-SpanId:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
                <stackTrace>
                    <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                        <maxDepthPerThrowable>30</maxDepthPerThrowable>
                        <maxLength>2048</maxLength>
                        <shortenedClassNameLength>20</shortenedClassNameLength>
                        <rootCauseFirst>true</rootCauseFirst>
                    </throwableConverter>
                </stackTrace>
            </providers>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="fileout" />
        <appender-ref ref="stdout" />
    </root>
</configuration>

有關帶有json日誌記錄的完整spring boot應用程式,請參閱示例應用程式訂單發貨

相關文章