SpringBoot (八)日誌配置

       SpringBoot日誌:Springboot內部採用的是Commons Logging 進行日誌記錄,但在底層爲Java Util,Loggin,Log4J,Logback等日誌框架提供默認配置,雖然有很多可用日誌框架,一般使用SpringBoot默認的Logback即可,Logback效率更高,支持SLF4J。

1. 日誌依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

     注:spring-boot-starter中包含了springboot-starter-logging

2. 日誌格式:

注:輸出如下內容:

       時間日期:精確到毫秒,可以用於排序                 日誌級別:ERROR,WARN,INFO,DEBUG,TRACE;

       進程ID:                                                                   分割符:採用---來標識日誌開始部分;

       線程名:方括號括起來;                                       Logger名:通常使用源代碼的類名;

       日誌內容:日誌輸出的信息

3.日誌輸出級別:

     SpringBoot默認輸出的日誌級別爲:INFO,WARN,ERROR;

     日誌級別從低到高爲:TRACE<DEBUG<INFO<WARN<ERROR<FATA 若設置爲WARN 則低於WARN級別的信息不會輸出

      如需輸出更多日誌可以通過以下方式開啓:

           命令模式配置:Java -jar app.jar -debug=true 這種命令會被SpringBoot解析,優先級最高;

           資源文件配置:application.properties 配置debug=true 即可

4.輸出級別配置:

      所有支持的日誌記錄系統都可以在spring環境中設置記錄級別(application.properties)

     格式爲:logging.level.* = LEVEL;

                   loggging.level :日誌級別控制前綴,*爲表名或loggger名;

                   LEVEL 選項:TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF;

     例子:logging.level.root =DEBUG root日誌以DEUBG級別輸出;

                logging.level.com.wuxia=DEBUG com.wuxia包下的所有class以DEBUG級別輸出;

#日誌配置
logging.level.root=info
logging.level.org.springframework.web=debug
logging.level.org.mybatis= INFO
logging.level.com.com.fyl.navigation.dao=debug

5.日誌輸出位置:

        默認情況下,Springboot僅將日誌輸出到控制檯,不會寫入到日誌文件中去,如果除了控制檯輸出之外還想寫日誌文件,則需要在application.proterties設置logging.file或logging.path屬性;

        logging.file :將日誌寫入到指定的文件中,默認爲相對路徑,可以設置爲絕對路徑。

        logging.path:將名爲spring.log寫入到指定的文件夾中

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

               如果只配置logging.path,會在指定文件夾下生成一個日誌文件spring.log 二者不能同時用,同時用只logging.file生效;

         默認日誌文件達到10MB時進行切割,產生新的日誌文件:(spring.1.log,spring.2.log);

    logging.file.max-size=10MB
    logging.file.max-history=10

6.自定義日誌配置

            日誌文件一般在ApplcationContext創建前就初始化了,所以不是必須通過spring的配置文件控制,可以外部添加配置文件控制日誌:

           根據不同的日誌系統,按如下規則建立配置文件名,就可以被加載:

          Logback:logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy;

          Log4j:log4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xml;

          推薦使用帶有spring的文件名作爲日誌文件;一般使用logback-spring.xml 作爲配置文件;文件放在resources下;

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--定義日誌文件的存儲地址:-->
    <property name="LOG_HOME" value="D:/logs"></property>
    <property name="LOG_NAME" value="logs"></property>
    <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="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}}"/>

    <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}}"/>
    <!--注意:日誌級別文件
                     日誌記錄採用分級記錄,級別與日誌文件名相對應,不同級別的日誌信息記錄到不同的日誌文件中:
    -->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">D
            <pattern>
                ${CONSOLE_LOG_PATTERN}
            </pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder> <!--<encoder>表示對日誌進行編碼-->
            <pattern>${FILE_LOG_PATTERN}</pattern><!-- 日誌格式 -->
            <charset>utf-8</charset><!--編碼方式 -->
        </encoder>
        <file>${LOG_HOME}/${LOG_NAME}-all.log</file> <!--輸出文件位置及文件名-->
        <!--日誌記錄器的滾動策略,按日期,大小記錄-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern> <!-- 歸檔日誌文件路徑 -->
                ${LOG_HOME}/backup/${LOG_NAME}-log-all-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>30</maxHistory><!-- 保留最近30天 -->
            <totalSizeCap>1GB</totalSizeCap><!--指定日誌文件上限,到達上限刪除舊文件 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize><!-- 日誌文件不超過5M,超過拆分文件 -->
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--filter爲系統定義的攔截器,使用ThresholdFilter來過濾掉ERROR級別以下的日誌文件不輸出到文件-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <file>${LOG_HOME}/${LOG_NAME}-error.log</file> 
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern> 
                ${LOG_HOME}/backup/${LOG_NAME}-log-error-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- 配置多環境日誌輸出:(prod:生產環境 ,test:測試環境,dev:開發環境 來定義不同日誌輸出)-->
    <springProfile name="prod">
        <appender-ref ref="fileInfoLog"/>
    </springProfile>
    <springProfile name="dev,test">
        <appender-ref ref="fileErrorLog"/>
    </springProfile>
    <root level="${logging.level.root}">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

7.打印日誌:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    private static Logger logger= LogManager.getLogger("UserService");
    @Override
    public List<User> showUser() {
        logger.info("hello");
        List<User> users = userMapper.showUser();
        return users;
    }
}

   注:每次打印日誌都要寫private static Logger log=LogManager.getLogger("UserService");很麻煩,可以使用lombok插件;

       在類上寫上註解@Slf4j:

@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> showUser() {
        log.info("hello");
        List<User> users = userMapper.showUser();
        return users;
    }
}

 

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