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>
-
控制檯輸出
日誌級別:FATAL > ERROR > WARN > INFO > DEBUG > TRACE,若設定FATAL,則低於FATAL的日誌都不會輸出。
SpringBoot預設輸出ERROR、WARN、INFO到控制檯。 -
檔案輸出
Springboot預設不會寫日誌到檔案,若需要寫入到日誌檔案則需要在application.properties配置logging.file或logging.path屬性(或是自定義外部日誌配置檔案)- logging.file 設定檔案,可以是相對路徑,也可以是絕對路徑,如:log.file=my.log
- logging.path設定目錄,自動在目錄下建立Spring.log
注:二者不能同時生效
-
級別控制
設定日誌級別,格式: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級別輸出
-
-
自定義日誌配置
由於日誌服務一般是在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使用不同的日誌配置,這個功能會很有用。
- Logback:
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;
}
}
-
多環境日誌輸出
根據不同的環境(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>