Spring Boot logback日志配置詳細配置——基於時間文件大小分割限制日志大小


正確配置

這里我使用的是springboot所以的 application.properties 文件增加

 logging.config=classpath:logback-spring.xml    // 指定日志配置文件

根目錄增加 logback-spring.xml 配置文件

logback-spring.xml 配置文件
注:<rollingPolicy> 標簽 的 ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy是重點
日志輸出的文件名:${LOG_FILE}-%d{yyyy-MM-dd}.%i.log   (%d 和 %i 必須存在)

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <include resource="com/zyc/datamonitor/logback/monitor.xml" optional="true"/>

    <property name="FILE_PATH_ERROR" value="${CY_LOG_HOME}/ops-error.log"/>
    <property name="FILE_PATH_WARN" value="${CY_LOG_HOME}/ops-warn.log"/>
    <property name="FILE_PATH_INFO" value="${CY_LOG_HOME}/ops.log"/>
    <property name="FILE_PATH_DEBUG" value="${CY_LOG_HOME}/ops-debug.log"/>
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{50} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件輸出的文件名 -->
        <File>${FILE_PATH_ERROR}</File>
        <!--滾動日志 基於時間和文件大小-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 滾動日志文件保存格式 -->
            <FileNamePattern>${FILE_PATH_ERROR}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>60MB</MaxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>
        <!-- 按臨界值過濾日志:低於ERROR以下級別被拋棄 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{50} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件輸出的文件名 -->
        <File>${FILE_PATH_INFO}</File>
        <!--滾動日志 基於時間和文件大小-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 滾動日志文件保存格式 -->
            <FileNamePattern>${FILE_PATH_INFO}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>60MB</MaxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>

        <!-- 按臨界值過濾日志:低於INFO以下級別被拋棄 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{50} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILE-WARN"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件輸出的文件名 -->
        <File>${FILE_PATH_WARN}</File>
        <!--滾動日志 基於時間和文件大小-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 滾動日志文件保存格式 -->
            <FileNamePattern>${FILE_PATH_WARN}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>60MB</MaxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>
        <!-- 按臨界值過濾日志:低於WARN以下級別被拋棄 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <!-- 按指定規則過濾日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch><!-- ERROR級別被拋棄 -->
            <onMismatch>NEUTRAL</onMismatch><!-- 其它級別繼續處理 -->
        </filter>
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{50} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILE-DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件輸出的文件名 -->
        <File>${FILE_PATH_DEBUG}</File>
        <!--滾動日志 基於時間和文件大小-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 滾動日志文件保存格式 -->
            <FileNamePattern>${FILE_PATH_DEBUG}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>60MB</MaxFileSize>
            <totalSizeCap>5GB</totalSizeCap>
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>
        <!-- 按臨界值過濾日志:低於INFO以下級別被拋棄 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <!-- 不過濾日志 -->
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger{50} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <springProfile name="test,dev">
        <logger name="org.springframework" level="INFO" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </logger>
        <logger name="o.springframework" level="INFO" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </logger>
        <logger name="com.netflix" level="INFO" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </logger>
        <logger name="com.zyc.test" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </logger>
        <logger name="java.sql" level="DEBUG" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </logger>

        <!-- 日志輸出級別 -->
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-DEBUG"/>
        </root>
    </springProfile>

    <springProfile name="prod,default">
        <logger name="org.springframework" level="WARN" additivity="false">
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
        </logger>
        <logger name="com.netflix" level="WARN" additivity="false">
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
        </logger>
        <logger name="com.zyc.test" level="INFO" additivity="false">
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
        </logger>
        <logger name="java.sql" level="INFO" additivity="false">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
        </logger>

        <!-- 日志輸出級別 -->
        <root level="WARN">
            <appender-ref ref="FILE-ERROR"/>
            <appender-ref ref="FILE-WARN"/>
            <appender-ref ref="FILE-INFO"/>
            <appender-ref ref="FILE-INFO"/>
        </root>
    </springProfile>
</configuration>

啟動參數 

#!/bin/bash

export CY_LOG_HOME="/logs/ops"
export SPRING_CLOUD_CONFIG_URI=http://10.20.1.1:9482
export SPRING_CLOUD_CONFIG_PROFILE=test_V1.0
export SPRING_CLOUD_CONFIG_LABEL=default
export SPRING_CLOUD_CONFIG_NAME=test
JAVA_OPTS="-server -Xmx2g -Xms2g -Xmn1024m -Xss256k -XX:MetaspaceSize=96m"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:CMSMaxAbortablePrecleanTime=5000"
JAVA_OPTS="$JAVA_OPTS -XX:+CMSClassUnloadingEnabled "
JAVA_OPTS="$JAVA_OPTS -XX:+CMSParallelRemarkEnabled"
JAVA_OPTS="$JAVA_OPTS -XX:+UseFastAccessorMethods"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JAVA_OPTS="$JAVA_OPTS -XX:+ExplicitGCInvokesConcurrent"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=80"
JAVA_OPTS="$JAVA_OPTS -XX:SurvivorRatio=10"
JAVA_OPTS="$JAVA_OPTS -XX:MaxDirectMemorySize=1g"
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CY_LOG_HOME/java.hprof"
JAVA_OPTS="$JAVA_OPTS -Xloggc:$CY_LOG_HOME/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
JAVA_OPTS="$JAVA_OPTS -Dlog_path=$CY_LOG_HOME"
java $JAVA_OPTS -Dspring.profiles.active=default -jar /server/test/lib/test.jar

Spring Boot 日志配置

官方文檔

Spring Boot使用Commons Logging進行所有內部日志記錄,但保留底層日志實現。為Java Util Logging,Log4J2和 Logback提供了默認配置 。在不同情況下,記錄器都預先配置為使用控制台輸出,並且還提供可選的文件輸出。

默認情況下,如果使用“Starters”,則使用Logback進行日志記錄。還包括適當的Logback路由,以確保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依賴庫都能正常工作。

日志格式

Spring Boot的默認日志輸出類似於以下示例:

2014-03-05 10:57:51.112 INFO 45469 --- [main] org.apache.catalina.core.StandardEngine:啟動Servlet引擎:Apache Tomcat / 7.0.52 
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] oaccC [Tomcat]。[localhost]。[/]:初始化Spring embedded WebApplicationContext 
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] osweb .context.ContextLoader:Root WebApplicationContext:初始化完成時間為1358 ms 
2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] osbceServletRegistrationBean:映射servlet:'dispatcherServlet'到[/] 
2014-03 -05 10:57:51.702 INFO 45469 --- [ost-startStop-1] osbcembedded.FilterRegistrationBean:映射過濾器:'hiddenHttpMethodFilter'為:[/ *]
復制代碼

Logback是沒有FATAL級別的日志,它將被映射到ERROR

  • 時間日期:精確到毫秒,可以用於排序
  • 日志級別:ERROR、WARN、INFO、DEBUG、TRACE
  • 進程ID
  • 分隔符:采用 --- 來標識日志開始部分
  • 線程名:方括號括起來(可能會截斷控制台輸出)
  • Logger名:通常使用源代碼的類名
  • 日志內容:我們輸出的消息

控制台輸出

日志級別從低到高分為:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL。
復制代碼

如果設置為WARN ,則低於WARN的信息都不會輸出。

Spring Boot中默認配置ERRORWARNINFO級別的日志輸出到控制台。

您還可以通過啟動您的應用程序 --debug 標志來啟用“調試”模式(開發的時候推薦開啟),以下兩種方式皆可:

在運行命令后加入--debug標志,如:$ java -jar springTest.jar --debug,這種命令會被 SpringBoot 解析,且優先級最高

在application.properties中配置debug=true,該屬性置為true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日志並不會輸出為DEBUG級別。

啟用調試模式時,將配置一些核心記錄器(嵌入式容器、 Hibernate 和 Spring Boot)來輸出更多的信息。 啟用調試模式不會將應用程序配置為以 DEBUG 級別登錄所有消息。

或者,你也可以通過使用 --trace標志(或application.properties中的trace=true)啟用“trace”模式。這樣做可以為選擇的核心記錄器進行跟蹤日志記錄(嵌入式容器,Hibernate數據庫生成和整個Spring 組合)。

彩色編碼輸出

如果你的終端支持ANSI,顏色輸出用於幫助可讀性。你可以在配置 文件中設置spring.output.ansi.enabled 來改變。 比如:

spring.output.ansi.enabled=always
復制代碼
  • ALWAYS: 啟用 ANSI 顏色的輸出。
  • DETECT: 嘗試檢測 ANSI 着色功能是否可用。
  • NEVER: 禁用 ANSI 顏色的輸出。

顏色編碼是通過使用% clr 轉換字來配置的。 在最簡單的形式中,轉換器根據日志級別對輸出進行顏色設置,如下面的示例所示:

%clr(%5p)
復制代碼

下表描述了將日志級別映射為顏色的情況:

Level color
FATAL Red
ERROR Red
WARN Yellow
INFO Green
DEBUG Green
TRACE Green

或者,你可以指定應該使用的顏色或樣式,將其作為轉換的選項。例如,為了使文本黃色,使用下 面的設置:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
復制代碼

支持以下顏色和風格:

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

文件輸出

默認情況下,Spring Boot 只會將日志記錄到控制台上,而不會寫日志文件。 如果你希望除了控制台輸出之外編寫日志文件,你需要設置一個logging.file件或 logging.path 屬性(例如在你的application.properties)。

logging.file logging.path Example Description
none none   控制台只記錄日志
特定文件 none my.log 寫入指定的日志文件。名字可以是工作目錄的確切位置或相對位置
noen 特定目錄 /var/log 寫入spring.log到指定的目錄。名字可以是工作目錄的確切位置或相對位置

日志文件在達到 10MB 時進行切割,與控制台輸出一樣,產生一個新的日志文件(如:spring.1.log、spring.2.log),新的日志依舊輸出到 spring.log 中去,默認情況下會記錄 ERROR、WARN、INFO 級別消息。

你可以通過設置logging.file.max大小的屬性來改變日志文件的大小限制。以前切割的文件會被無限期存檔,除非已經設置了logging.file.max歷史屬性

注:logging.file和logging.path二者不能同時使用,如若同時使用,則只有logging.file生效

日志系統是在應用程序生命周期的早期初始化的。 因此,在通過@propertysource 注釋加載的屬性文件中找不到日志屬性。

日志記錄屬性獨立於實際的日志基礎結構。 因此,spring Boot 不管理特定的配置鍵(如 Logback.configurationFile for Logback)。

日志輸出級別

所有支持的日志記錄系統可以通過使用logging.level.<包名或Logger名>=<日志級別>在Spring環境中設置日志記錄器級別(例如,在application.properties中),其級別可以是TRACE、DEBUG、INFO、WARN、ERROR、FATAL或OFF任意一個。root記錄器可以通過使用logging.level.root進行配置。

下面的示例顯示了在application.properties中配置。

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
復制代碼

自定義日志配置

你可以使用org.springframework.boot.logging.LoggingSystem系統屬性強制Spring Boot使用特定的日志記錄系統。 該值應該是LoggingSystem實現的完全限定類名。 您還可以使用none值完全禁用Spring Boot的日志記錄配置。

因為日志記錄是在創建ApplicationContext之前初始化的,所以無法控制Spring@Configuration文件中的@PropertySources的日志記錄。更改日志記錄系統或完全禁用日志記錄的唯一方法是通過系統屬性。

根據你的日志記錄系統,將加載以下文件:

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

在可能的情況下,我們建議你使用 -spring來進行日志配置(例如:logback-spring.xml而不是logback.xml)。如果使用logback.xml,Spring無法完全控制日志初始化。

為了幫助進行自定義,Spring環境將一些其他屬性轉移到System屬性,如下表所述:

Spring Environment System Property Comments
logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 記錄異常時使用的轉換詞。
logging.file LOG_FILE 將日志寫入到指定的文件中,默認為相對路徑,可以設置成絕對路徑
logging.file.max-size LOG_FILE_MAX_SIZE 最大日志文件大小(如果啟用了日志文件)。 (只支持默認的 Logback 設置。)
logging.file.max-history LOG_FILE_MAX_HISTORY 需要保存的存檔日志文件的最大數量(如果啟用了日志文件)。 (只支持默認的 Logback 設置。)
logging.path LOG_PATH 將名為 spring.log 寫入到指定的 文件夾 中,如(/var/log)
logging.pattern.console CONSOLE_LOG_PATTERN 在控制台上使用的日志模式(stdout)。 (只支持默認的 Logback 設置。)
logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 設置日志輸出日期格式(只支持默認的 Logback 設置。)
logging.pattern.file FILE_LOG_PATTERN 定義輸出到日志文件的日志格式
logging.pattern.level LOG_LEVEL_PATTERN 繪制日志級別時使用的格式
PID PID 當前的進程ID

如果你想在日志屬性中使用占位符,則應使用 Spring Boot 的語法,而不是基礎框架的語法。 值得注意的是,如果使用Logback,你應該使用 : 作為屬性名和其默認值之間的分隔符,而不是使用 :-

Logback擴展配置

Spring Boot 包含了一些 Logback 擴展,這些擴展可以幫助提高配置。 您可以在 logback-spring.xml 配置文件中使用這些擴展。 由於標准logback.xml配置文件過早加載,所以不能在其中使用擴展。您需要使用logback- spring.xml,或者定義一個loggingconfig屬性。

擴展配置不能與Logback的配置掃描一起使用。 如果嘗試這樣做,對配置文件進行更改會導致類似以下記錄之一的錯誤:

ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
復制代碼

springProperty

<springProfile> 標簽使我們讓配置文件更加靈活,它可以選擇性的包含或排除部分配置

<springProfile name="dev">
    <!-- 開發環境時激活 -->
</springProfile>

<springProfile name="dev,test">
    <!-- 開發,測試的時候激活,多個環境用逗號隔開-->
</springProfile>

<springProfile name="!prod">
    <!-- 當 "生產" 環境時,該配置不激活-->
</springProfile>
復制代碼

例子:

    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
    <springProfile name="test,dev">
        <logger name="com.example.demo.controller" level="DEBUG" additivity="false">
            <appender-ref ref="consoleLog"/>
        </logger>
    </springProfile>

    <!-- 生產環境. -->
    <springProfile name="prod">
        <logger name="com.example.demo.controller" level="INFO" additivity="false">
            <appender-ref ref="consoleLog"/>
        </logger>
    </springProfile>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM