在Spring Boot中輸出日誌

在Spring Boot中輸出日誌

Spring Boot日誌默認配置

Spring Boot提供了“開箱即用”的日誌功能,默認配置如下:

  • 默認只輸出日誌到控制檯
  • 默認日誌級別爲INFO
  • 默認使用logback日誌

日誌級別(logging level)

日誌級別的嚴重級別從高到低依次爲:

ERROR > WARN > INFO > DEBUG > TRACE

日誌輸出時會將指定級別級以上的日誌都輸出,比如指定INFO級別時,ERROR、WARN和INFO級別的日誌都會被輸出。

使用logback或log4j2日誌

Spring Boot早期默認使用log4j日誌,後面由於log4j性能問題改爲默認使用logback。

而log4j2出現後,由於其性能比logback更好,很多Spring Boot開發者已經改用log4j2,而Spring Boot也支持log4j2。

阿里的Druid數據庫連接池就使用了log4j2。

使用logback

由於Spring Boot默認使用了logback日誌,因此只需要在resources目錄添加logback-spring.xml,並配置日誌級別、日誌輸出路徑和文件名、日誌備份策略等就可以了。

logback-spring.xml示例:

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

    <property name="LOGS" value="./logs" />

    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "me.cookcode.*" at TRACE level -->
    <logger name="me.cookcode" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

上面配置:

  • 指定了全局的日誌級別爲INFO,輸出到控制檯(Console)和滾動日誌文件(RollingFile)
  • 其中,指定了滾動日誌文件輸出到./logs/spring-boot-logger.log,每天或者日誌文件大小超過10M時,自動備份到./logs/archived/目錄。
  • 還說明了可以按包名來設置日誌級別

使用log4j2

由於Spring Boot默認使用logback,因此需要先禁用Spring Boot中的logback依賴,再引入log4j2依賴。

pom.xml示例:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<!-- 禁用用Spring Boot默認的logback日誌 -->
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!-- 使用log4j2日誌 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

在resources目錄下添加log4j2-spring.xml,並配置日誌級別、日誌輸出路徑和文件名、日誌備份策略等。

log4j2-spring.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
        </Console>

        <RollingFile name="RollingFile"
                     fileName="./logs/spring-boot-logger-log4j2.log"
                     filePattern="./logs/$${date:yyyy-MM}/spring-boot-logger-log4j2-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- rollover on startup, daily and when the file reaches
                    10 MegaBytes -->
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy
                        size="10 MB" />
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- LOG everything at INFO level -->
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>

        <!-- LOG "me.cookcode.*" at TRACE level -->
        <Logger name="com.cookcode" level="trace"></Logger>
    </Loggers>

</Configuration>

上面配置:

  • 指定了全局的日誌級別爲INFO,輸出到控制檯(Console)和滾動日誌文件(RollingFile)
  • 其中,指定了滾動日誌文件輸出到./logs/spring-boot-logger-log4j2.log,每天或者日誌文件大小超過10M時,自動備份到./logs/yyyyMM/目錄,並壓縮歸檔日誌文件爲.gz格式。
  • 還說明了可以按包名來設置日誌級別

一個完整的log4j2-spring.xml參考:

Druid中使用log4j2進行日誌輸出

在代碼中輸出日誌

爲了避免更換日誌系統(比如將logback更換爲log4j2時)改動代碼,強烈建議在代碼中通過SLF4j來包裝日誌系統使用。

還可以使用lombok的@Slf4j註解來簡化要在每個類的開頭編寫獲取logger的樣板代碼。

參見:

使用lombok減少編寫Java樣板代碼

參考文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章