1. 程式人生 > >springboot+日誌

springboot+日誌

日誌

問題:

  • 如何引入日誌
  • 日誌的輸出格式以及輸出方式
  • 程式碼中使用日誌

Logback

​ Springboot所有的內部日誌使用Commons Logging,Slf4J定義了統一的日誌抽象介面,SpringBoot預設配置提供對常用日誌實現的支援,如:Java Util Logging(JDK)、Log4J、Log4J2、Logback
Loback是log4j開發提供的新一代日誌框架,效率高,支援多種環境,天然支援Slf4J。
Springboot預設使用Logback記錄日誌,info級別輸出導Console.

//新增依賴,將使用LogBack,開箱即用
//由於spring-boot-starter包含了,可以省略
<
dependency
>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
  1. 控制檯輸出

    日誌級別:FATAL > ERROR > WARN > INFO > DEBUG > TRACE,若設定FATAL,則低於FATAL的日誌都不會輸出。
    SpringBoot預設輸出ERROR、WARN、INFO到控制檯。

  2. 檔案輸出
    Springboot預設不會寫日誌到檔案,若需要寫入到日誌檔案則需要在application.properties配置logging.file或logging.path屬性(或是自定義外部日誌配置檔案)

    • logging.file 設定檔案,可以是相對路徑,也可以是絕對路徑,如:log.file=my.log
    • logging.path設定目錄,自動在目錄下建立Spring.log
      注:二者不能同時生效
  3. 級別控制
    設定日誌級別,格式:logging.level.*

    • logging.level 日誌級別控制字首,*可以是包名或logger名

    • LEVEL,選項[fatal、error、warn、info、debug、trace]

      logging.level.com.dudu=DEBUG:com.dudu包下所有class以DEBUG級別輸出
      logging.level.root=WARN:root日誌以WARN級別輸出
      
  4. 自定義日誌配置

    由於日誌服務一般是在ApplicationContext建立之前初始化的,所以不是必須通過Spring配置檔案控制,可以引入外部配置檔案。
    根據不同的日誌系統,需要按照對應的規則組織配置檔案,才能被自動載入。

    • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
    • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
    • Log4j2:log4j2-spring.xml, log4j2.xml
    • JDK (Java Util Logging):logging.properties
      按照上面命名規則,在src/main/resources配置即可。
      也可以在application.properties中設定日誌配置檔案,雖然一般並不需要改變配置檔案的名字,但是如果你想針對不同執行時Profile使用不同的日誌配置,這個功能會很有用。
logging.config=classpath:logging-config.xml

​ 基本的logback.xml外部日誌配置檔案demo

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan=“true”	 		配置檔案改變,重新載入
scanPeriod 			檢測配置檔案是否修改的時間間隔
debug 				是否列印logback內部日誌資訊 
contextName  		上下文名稱,每個logger都關聯一個logger上下文,用於區分不同應用程式的日誌記錄

ThresholdFilter 	系統定義的攔截器,用於攔截過濾指定級別的日誌
RollingFileAppender 輸出日誌到檔案
rollingPolicy		定義日誌檔案切分方式
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>	每一天的日誌歸檔到一個檔案中
<maxHistory>30</maxHistory>表示只保留最近30天的日誌
<totalSizeCap>1GB</totalSizeCap>用來指定日誌檔案的上限大小

root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。

<loger>用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender>
		name:用來指定受此loger約束的某一個包或者具體的某一個類。
		level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前loger將會繼承上級的級別。
		addtivity:是否向上級loger傳遞列印資訊。預設是true
-->
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>logback</contextName>
    <property name="log.path" value="E:\\test\\logback.log" />
    
    <!--輸出到控制檯-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
       <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>-->
        <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.TimeBasedRollingPolicy">
            <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>

    <!-- logback為java中的包 -->
    <logger name="com.dudu.controller"/>
    <!--logback.LogbackDemo:類的全路徑 -->
    <logger name="com.dudu.controller.LearnController" level="WARN" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration>

loger在程式碼中的使用

package com.dudu.controller;
@Controller
public class LearnController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public Map<String,Object> login(HttpServletRequest request, HttpServletResponse response){
        //日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低於WARN的資訊都不會輸出。
        logger.trace("日誌輸出 trace");
        logger.debug("日誌輸出 debug");
        logger.info("日誌輸出 info");
        logger.warn("日誌輸出 warn");
        logger.error("日誌輸出 error");
        Map<String,Object> map =new HashMap<String,Object>();
        String userName=request.getParameter("userName");
        String password=request.getParameter("password");
        if(!userName.equals("") && password!=""){
            User user =new User(userName,password);
            request.getSession().setAttribute("user",user);
            map.put("result","1");
        }else{
            map.put("result","0");
        }
        return map;
    }
}
  1. 多環境日誌輸出
    根據不同的環境(prod:生產環境,test:測試環境,dev:開發環境)定義不同日誌輸出,在logback-spring.xml設定springProfile節點定義。
    注意:使用Spring拓展profile支援,檔名必須是loback-spring.xml

    <!-- 測試環境+開發環境. 多個使用逗號隔開. -->
    <springProfile name="test,dev">
        <logger name="com.dudu.controller" level="info" />
    </springProfile>
    <!-- 生產環境. -->
    <springProfile name="prod">
        <logger name="com.dudu.controller" level="ERROR" />
    </springProfile>