iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Software Development

一個新鮮人如何完轉Spring boot與DevOps從0到101系列 第 15

Logback 配置來客製化 Log 訊息吧

在 Spring boot 可以使用 Logback 進行配置,系統預設加載日誌配置檔案

  • logback-spring.xml
  • logback-spring.groovy
  • logback.xml
  • logback.groovy

為自己的環境配置有兩種方法,如果只是簡單的更改,則可以把屬性添加到 application.properties 等配置屬性檔案中,或者對於更複雜的需求,可以使用 XMLGroovy 來指定設置。

在 Maven 環境中我們添加以下屬性

        <!-- 整合 fluent         -->
        <dependency>
			<groupId>org.fluentd</groupId>
			<artifactId>fluent-logger</artifactId>
			<version>0.3.4</version>
		</dependency>
        <!-- 主要是這個         -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- send to flunted -->
		<dependency>
			<groupId>com.sndyuk</groupId>
			<artifactId>logback-more-appenders</artifactId>
			<version>1.8.0</version>
		</dependency>
        <!-- 配置 Json         -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>6.6</version>
		</dependency>

logback-classic 包含 logback-core 依賴關係,他們之間有著我們可以配置的屬性。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n
      </pattern>
    </encoder>
  </appender>

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

</configuration>

建立一個 ConsoleAppender 的類,相似於 System.out.print 打印數據一樣。該配置設置了日誌輸出的格式,這些表示方式根據已發送到記錄器的訊息替換為生成的值。該格式含有一些符號,如下說明

  • %d
    • 日誌訊息觸發的時間
  • %thread
    • 日誌訊息的執行續時間
  • $-5level
    • 日誌等級
  • %logger{36}
    • 輸出發生日誌訊息的 package 和 class,{36} 限制了其長度
  • %M
    • 發生該日誌訊息的方法名稱
    • 會影響效能
  • %msg
    • 日誌訊息
  • %n
    • 換行
  • %magenta()
    • 輸出顏色
  • highlight()
    • 設置日誌級別輸出的顏色

如果要在與根級別不同的級別上記錄該 class 的訊息,則可以為該 class 定義自己的記錄器。如下

<logger name="com.xxx.service.MyServiceImpl"  additivity="false" level="DEBUG">
  <appender-ref ref="STDOUT" /> <!-- 參照前面所定義的日誌格式 -->
</logger>

不使用 additivity=false 將導致訊息被打印兩次,原因是根日誌附加程序和類級別附加程序都寫入日誌。

配置將日誌寫入檔案

<springProfile name="file">
        <property name="logPath" value="/var/log"/>
        <appender name="fileInfoLog" filePermissions="rw-r--r--" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers class="net.logstash.logback.composite.loggingevent.LoggingEventJsonProviders">
                    <pattern>
                        <pattern>
                            {
                                "timestamp": "%date{ISO8601}",
                                "level": "%level",
                                "application": "${springAppName:-}",
                                "trace": "%X{trace_id:-}",
                                "span": "%X{span_id:-}",
                                "trace_flags": "%X{trace_flags:-}",
                                "pid": "${PID:-}",
                                "thread": "%thread",
                                "class": "%logger{40}",
                                "message": "%message"
                            }
                        </pattern>
                    </pattern>
                </providers>
            </encoder>
            <!--滾動策略-->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!--路徑-->
                <fileNamePattern>${logPath}/info.%d{dd-MM-yyyy}_%i.log</fileNamePattern>
                <maxHistory>7</maxHistory>
                <maxFileSize>10MB</maxFileSize>
                <totalSizeCap>100MB</totalSizeCap>
            </rollingPolicy>
        </appender>

        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="fileInfoLog" />
        </root>
    </springProfile>

參考資源

不同環境配置文件的配置

<springProfile name="staging">
	...
</springProfile>

<springProfile name="dev">
	...
</springProfile>

<springProfile name="!prod">
    ...
</springProfile>

上一篇
談談 Log 的定義以及使用 - part1
下一篇
日誌集中管理
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130

尚未有邦友留言

立即登入留言