SpringBoot項目中日志控制,配置logback(logback.xml的配置及介紹)
- 前言
- 一、大緻介紹
-
- logback依賴jar包
- logback的預設配置
- 建立logback.xml配置檔案
- 仰天大笑出門去,我輩豈是蓬蒿人
前言
SpringBoot項目中對日志的處理手動控制,這是我整理的logback.xml檔案内容,直接複制copy使用即可,裡面有詳細的注釋使用,如果是單子產品,就在java同層級的resoures目錄下(存放application.yml那個目錄下)建立一個logback.xml,重新開機服務即可生效。
一、大緻介紹
可直接跳過,看後面的logback.xml内容,懂的直接複制使用,一是一些理論知識,供了解的
logback依賴jar包
SpringBoot項目配置logback理論上需要添加logback-classic依賴jar包:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
但是因為SpringBoot項目預設就是使用的就是logback日志系統,建立SpringBoot項目時引入的spring-boot-starter或者spring-boot-starter-web依賴jar包中已經包含了spring-boot-starter-logging的依賴,裡面同時包含多種日志系統依賴,如下圖所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLlRTZjlDM3YDOjVWNxQmN5YDM1QTZiZWZhN2Y2MzMlJzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
包括logback和log4j,是以,
無需額外添加依賴,直接配置logback.xml就可以了
。
此外,如果需要切換為log4j2,那麼需要在spring-boot-starter-web依賴中排除springboot自帶的commons‐logging,然後在引入log4j2的依賴jar包
,如下所示:
<!--排除 commons‐logging-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>commons‐logging</groupId>
<artifactId>commons‐logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
logback的預設配置
前面說到SpringBoot項目預設使用logback,那麼對于logback的配置情況,SpringBoot又是如何定義的呢?
首先,SpringBoot會從resource包下查找logback-test.xml或logback.xml ,如果這兩個都不存在,則會調用BasicConfigurator,建立一個最小化的基本配置。
最小化配置由一個關聯到根logger的ConsoleAppender組成,預設輸出模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n;
root logger級别為DEBUG,是以并不會生成日志檔案,隻會輸出到控制台。
建立logback.xml配置檔案
通過自定義logback.xml配置檔案來控制日志輸出情況,通常我們會配置三個日志元件:
- 控制台輸出
- 輸出info級别日志檔案
- 輸出error級别日志檔案
以下為logback.xml完整配置,裡面有具體的注釋,直接copy使用
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan 當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。 -->
<!-- scanPeriod 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug 當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 讀取application.properties配置 -->
<!-- <property resource="application.properties" />-->
<!-- 生成檔案名字首 -->
<property name="FILE_PREFIX" value="yyzRead" />
<!-- 輸出檔案路徑 -->
<property name="OPEN_FILE_PATH" value="D:\log_yyzDevelopRead"/>
<!-- 檔案儲存時間 這裡是7天 -->
<property name="EXIST_TIME" value="7"/>
<!-- 檔案輸出格式 -->
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 日志檔案最大的大小 -->
<property name="MAX_FILE_SIZE" value="10MB"/>
<!-- 控制台輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 輸出到all檔案 這裡是全部的日志内容 -->
<appender name="OPEN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--不能有這項配置!!!!!-->
<!--<Encoding>UTF-8</Encoding>-->
<!--<File>${OPEN_FILE_PATH}/${FILE_PREFIX}.log</File>-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志檔案輸出的檔案名-->
<FileNamePattern>${OPEN_FILE_PATH}/all/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<!--日志檔案保留天數-->
<MaxHistory>${EXIST_TIME}</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--日志檔案最大的大小-->
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<!--輸出到debug檔案-->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${OPEN_FILE_PATH}/debug/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 隻列印DEBUG日志, -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級别 -->
<level>DEBUG</level>
<!-- 比對時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不比對時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到info檔案-->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${OPEN_FILE_PATH}/info/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 隻列印INFO日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!-- 比對時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不比對時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到error檔案-->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${OPEN_FILE_PATH}/error/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 隻列印ERROR日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<!-- 比對時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不比對時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--輸出到warn檔案-->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${OPEN_FILE_PATH}/warn/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 隻列印WARN日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<!-- 比對時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不比對時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 預設輸出info等級,然後再根據各自的攔截過濾規則去處理 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="OPEN-FILE"/>
<appender-ref ref="debug" />
<appender-ref ref="info" />
<appender-ref ref="error" />
<appender-ref ref="warn" />
</root>
</configuration>