Spring Boot 日志


日志框架是任何一套系統中不可獲取的部分,我們需要通過日志來記錄用戶的有效操作。
 
 
JUL: JDK 自帶的Logging (實現太過簡陋,對開發者不友好)
JCL: Jakarta Commons Loggin(Apache) ()
Log4j: (作者是ceki,Log4j是作者選擇放棄而推薦Logback)
Log4j2: (Apache,過於先進,開源框架對其支持有限,最大的優勢是高於Log4j的超高性能)
Logback: (作者是 ceki ,真正意義上的Log4j2)
SLF4j: (作者是 ceki
jboss-logging: (誕生之初就不是為了服務大眾,也沒有收到青睞)
 
 

簡單的日志示例

 
一個簡單的日志示例:
import org.slf4j.Logger;

@RunWith(SpringRunner.class)
// 指定上下文,讓日志運行於Spring環境
@SpringBootTest
public class LoggerTest {
    private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    @Test
    public void test1() {
        logger.debug("debug...");
        logger.info("info...");
        logger.error("error...");
    }
}

 

 
輸出結果:
 
之所以沒有打印debug的內容是因為系統默認打印info以上的內容,那么系統有哪些層級呢?
 
查看系統的層級
ctrl + N (windows) 查找類:
 
 
 
從上面的代碼我們可以看到我們需要用到LoggerFactory.getLogger(類名),才能讓輸出的時候打印出本類的類名。這樣每次都要配置就非常麻煩,那么我們可以借助一個小插件,來優化這個過程。
lombok插件 —— 這個插件不僅可以幫我們簡化getter,setter方法的編寫,還能幫我們減少很多代碼的編寫,也能幫助我們優化日志的使用,具體安裝及配置見如下連接: lombok在idea中安裝以及使用
 
利用lombok優化后,代碼如下:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
    @Test
    public void test1() {
        String name = "imooc";
        String password = "123456";
        log.debug("debug...");
        log.info("info...");
        log.info("name: {}, password: {}", name, password);
        log.error("error...");
    }
}

 

 
運行結果如下:
 
 

Logback的配置

通過修改Logback的配置,可以個性化完成我們的日志需求,也能實現上面講過的各種功能。
配置的Logback的文件
appilcation.yml (配置簡單,功能簡單)
logback-spring.xml  (配置復雜,功能強大)

假設我們有以下兩個需求:

區分info和error日志
每天產生一個日志文件

 

具體配置過程
配置application.yml
logging:
  pattern:
#    console: "%d - %msg%n" # 指定控制到輸出格式,但日志文件可以看到詳細信息
#  path: /var/log/tomcat/   # 指定輸出路徑
  file: /var/log/tomcat/sell.log  #指定輸出文件
  level: debug #指定日志級別
  level:
    com.dante.imooc.sell.LoggerTest: debug #指定某一類的日志級別

 

 
application.yml只能簡單的配置一些指定路徑,如果我們需要完成更復雜的目標,就需要更詳細的配置。
 
配置logback-spring.xml指定不同level的日志到不同的文件,並且按時間滾動。
1.resources目錄下新建logback-spring.xml文件
2.進行日志輸出配置,配置示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <Layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </Layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--禁止-->
            <onMatch>DENY</onMatch>
            <!--接受-->
            <onMismatch>ACCEPT</onMismatch>
            <!--命中ERROR就DENY,沒有命中ERROR就ACCEPT-->
            <!--filter三種操作,DENY(禁止),NEUTRAL(中立),ACCEPT(接受): 分別對應拒絕,忽略,接受-->
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

 

 
3.關於配置的細節可以參照依賴庫“ org.springframework.boot.logging.logback”的下列文件:
base.xml

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

<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->

<included>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</included>

 

 
defaults.xml

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

<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <appender name="DEBUG_LEVEL_REMAPPER" class="org.springframework.boot.logging.logback.LevelRemappingAppender">
        <destinationLogger>org.springframework.boot</destinationLogger>
    </appender>

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
    <logger name="org.crsh.plugin" level="WARN"/>
    <logger name="org.crsh.ssh" level="WARN"/>
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
    <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="WARN"/>
    <logger name="org.springframework.boot.actuate.endpoint.jmx" additivity="false">
        <appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
    </logger>
    <logger name="org.thymeleaf" additivity="false">
        <appender-ref ref="DEBUG_LEVEL_REMAPPER"/>
    </logger>
</included>

 

 
 
 
file-appender.xml

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

<!--
File appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%i</fileNamePattern>
        </rollingPolicy>
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
</included>

 

 
console-appender.xml

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

<!--
Console appender logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
</included>

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">






免責聲明!

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



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