SpringBoot默認的日誌管理logback

1.SpringBoot使用的默認日誌框架是Logback,並用INFO級別輸出到控制檯:

         日誌輸出內容元素具體如下:

                   時間日期:精確到毫秒

                   日誌級別:ERROR,WARN,INFO,DEBUG,TRACE

                   進程ID

                   分隔符:--標識實際日誌的開始

                   線程名:方括號括起來(可能會階段控制檯輸出)

                   Logger名:通常使用源代碼的類名

                   日誌內容

         日誌依賴:該依賴內容就是SpringBoot默認的日誌框架logback,不需要另外導入,已經默認導入了。

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-logging</artifactId>

</dependency>

日誌級別(從低到高):

TRACE < DEBUG < INFO < WARN < ERROR < ALL < OFF

如果設置爲WARN,那麼低於WARN的信息都不會輸出

以下配置需要在application.properties文件中設置

##root日誌以WARN級別輸出

logging.level.root=WARN(讓日誌只輸出warn及以上級別的信息)

 

##springframework.web 日誌以DEBUG級別輸出

logging.level.org.springframework.web=DEBUG

 

##hibernate 日誌以ERROR級別輸出

logging.level.org.hibernate=ERROR

 

默認情況下,SpringBoot將日誌輸出到控制檯,不會寫到日誌文件中。如果要編寫除控制檯輸出之外的日誌文件,則需要application.properties中設置logging.file 或者logging.path屬性

logging.file=log/my.log(相對)或logging.file=/log/my.log(絕對)

logging.path設置目錄,會在該目錄下創建spring.log文件,並寫入日誌內容,如logging.path=/var/log

 

如果只配置logging.file, 會在項目的當前路徑下生成一個xxx.log日誌文件。

如果只配置logging.path, 會在/var/log文件夾下生成日誌文件spring.log

注意:二者不可同時使用,若同時使用,則只有logging.file生效

默認情況下,日誌文件的大小達到10MB時,會切分一次,產生新的日誌文件,默認級別爲:ERROR, WARN, INFO

logging.level.root=WARN

logging.level.org.springframework.web=DEBUG

logging.file=d:/log/info.log

##控制檯顯示日誌的格式

logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n

##文件顯示日誌的格式

logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

 

2. 自定義日誌配置

可以使用其他系統對日誌進行配置

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

    <!-- scan表示當配置文件發生變化時,會進行重新加載 -->

    <configuration scan="true" scanPeriod="60 seconds" debug="false">

       <contextName>logback</contextName>

       <property name="log.path" value="d:/log/info.log" />

       <!-- 輸出到控制檯 -->

       <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

           <encoder>

              <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>

           </encoder>

       </appender>

       <!-- 輸出到文件 -->  

       <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> 

           <file>${log.path}</file> 

           <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingFileAppender">

               <!-- 日誌切分方式,每一天的日誌歸併到同一天 -->

               <fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>

           </rollingPolicy>

           <encoder> 

             <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> 

           </encoder> 

       </appender>

       <root level="info">

           <appender-ref ref="console" />

           <appender-ref ref="file" />

       </root>

      

       <!-- logbackjava中的包 -->

       <logger name="cn.huangwei.controller" />

       <!-- additivity是否向上級logger傳遞打印信息 -->

        <logger name=" cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

  </configuration>

scan:配置文件如果發生變化,將會重新加載,默認值爲true;

scanPeriod:設置檢測配置文件的時間間隔,默認單位毫秒,默認間隔1分鐘。

debug:設置爲true時,將打印出logback內部日誌信息。默認爲false

contextName標籤:一旦設置不能更改,可以通過%contextName來獲取上下文名稱

 

logger的使用:

<root level="info">

            <appender-ref ref="console" />

            <appender-ref ref="file" />

        </root>

<!-- logbackjava中的包 -->

          <logger name="cn.huangwei.controller" />

          <!-- additivity是否向上級logger傳遞打印信息 -->

           <logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

第一個logger只指定了包名,這樣控制了這個包下面的所有文件的日誌的打印。這裏的打印級別沒有單獨設置,故默認與上一級別一致,即root中的info級別,而root中的可以向console和file輸出日誌信息,默認爲console輸出。

例如新建一個TestController

package cn.huangwei.controller;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class TestController {

   

    private Logger logger = LoggerFactory.getLogger(this.getClass());

   

    @RequestMapping("/show")

    @ResponseBody

    public String show() {

       logger.debug("debug日誌");

       logger.info("info日誌");

       logger.warn("warn日誌");

       logger.error("error日誌");

       return "show";

    }

}

該文件是在cn.huangwei.controller包下面的文件,沒有設置level,故使用root上級的日誌級別,沒有設置additity,故默認爲true,向上傳遞。故遵循上一級root的日誌輸出方式,輸出info及info以上級別的日誌,默認輸出控制檯上。

運行項目,在地址欄輸入localhost:8080/show,查看控制檯的日誌輸出

<!-- additivity是否向上級logger傳遞打印信息 -->

           <logger name="cn.huangwei.controller.SpringTestController" level="WARN" additivity="false">

            <appender-ref ref="console"/>

        </logger>

第二個logger,對於SpringTestController文件,打印warn及warn級別以上的日誌,additivity爲false表示不向上級傳遞日誌信息,它的繼承關係爲cn.huangwei.controller.SpringTestController的上一級爲cn.huangwei.controllercn.huangwei.controller的上一級爲root自身通過console打印日誌信息

修改SpringTestController類;所以當SpringTestController接收到日誌消息時,自身進行打印,上級cn.huangwei.controller的logger沒有收到消息,就不需要向上傳遞,故只打印一份日誌。

運行之後得到結果

如果將additivity設置爲true,需要向上級傳遞,由上級來執行日誌信息;結果爲

分析:SpringTestController的上一級是cn.huangwei.controller,cn.huangwei.controller的上一級是root,當SpringTestController收到日誌消息時,自身通過appender打印消息,然後向上級cn.huangwei.controller傳遞,由於該logger沒有level,沒有additity,沒有appender,就委託給它上級root打印日誌消息,因此日誌消息打印第二遍。

問:logger的繼承關係(上下級)怎麼判斷?

是根據logger的name屬性中“.”點號分隔符進行判斷的,例如cn.huangwei是cn.huangwei.controller的上級,如果沒有點號例如huangwei,那麼他的上級是root。

<!-- logger,第一級 -->

       <root level="info">

           <appender-ref ref="console" />

           <appender-ref ref="file" />

       </root>

      

       <!-- loggerjava中的包下日誌管理,additivity默認爲true -->

       <logger name="cn.huangwei.controller" level="debug"/>

       <!-- additivity是否向上級logger傳遞打印信息 -->

       <logger name="cn.huangwei" level="warn" additivity="false">

            <appender-ref ref="console"/>

        </logger>

日誌輸出結果爲:

問:繼承關係中的上下級日誌等級問題?

如果日誌消息對應的logger有level屬性,按照level屬性來,如果沒有,按照上級的level屬性來,如果連root都沒有,默認debug。

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