0、引言
Java項目開發調試或維護過程中,爲方便問題快速定位,很多時候都會在代碼中增加相關日誌,但爲了減少日誌輸出量,在生產環境通常都提高了日誌的級別,導致生產環境出現問題時調試信息沒有打印出來,排查定位問題比較困難。
那麼,能否動態修改日誌的級別?答案是肯定的。當出現問題時,動態降低日誌級別,輸出相關的調試信息;問題解決後,動態提高日誌級別,屏蔽相關的調試信息。
1、實現過程
1.1 動態修改Log4J的日誌級別
以下代碼在 log4j 1.2.17
版本上驗證通過
package com.kedacom.skyforweb.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 動態修改j日誌等級
* @author [email protected]
* @date 2017年6月17日 上午12:13:18
* @note Log4jController
*/
@Controller
@RequestMapping("/log4j")
public class Log4jController {
@RequestMapping(value = "/root/{level}", method = RequestMethod.GET)
@ResponseBody
public String updateRootLog4jLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("level") String levelName) {
Level level = Level.toLevel(levelName);
LogManager.getRootLogger().setLevel(level);
return "修改root的log4j{" + levelName + "}級別成功";
}
@RequestMapping(value = "/{package}/{level}", method = RequestMethod.GET)
@ResponseBody
public String updateLog4jLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("package") String packageName,
@PathVariable("level") String levelName) {
Level level = Level.toLevel(levelName);
LogManager.getLogger(packageName).setLevel(level);
return "修改package{" + packageName + "}的log4j{" + levelName + "}級別成功";
}
}
1.2 動態修改Logback的日誌級別
以下代碼在 logback 1.2.3
版本上驗證通過
package com.kedacom.skyforweb.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
/**
* 動態修改logback日誌級別
* @author [email protected]
* @time 2020年4月7日 下午3:29:21
* @since 1.0.0
*/
@Controller
@RequestMapping("/logback")
public class LogbackController {
@RequestMapping(value = "/root/{level}", method = RequestMethod.GET)
@ResponseBody
public String updateRootLogbackLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("level") String levelName) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.toLevel(levelName));
return "修改root的logback{" + levelName + "}級別成功";
}
@RequestMapping(value = "/{package}/{level}", method = RequestMethod.GET)
@ResponseBody
public String updateLogbackLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("package") String packageName,
@PathVariable("level") String levelName) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.getLogger(packageName).setLevel(Level.toLevel(levelName));
return "修改package{" + packageName + "}的logback{" + levelName + "}級別成功";
}
}
2、驗證
通過瀏覽器訪問下面地址進行驗證
## 修改log4j的root的日誌級別
http://<ip>:<port>/<contextPath>/log4j/root/DEBUG
http://<ip>:<port>/<contextPath>/log4j/root/INFO
http://<ip>:<port>/<contextPath>/log4j/root/ERROR
## 修改log4j的org.apache包的日誌級別
http://<ip>:<port>/<contextPath>/log4j/org.apache/DEBUG
http://<ip>:<port>/<contextPath>/log4j/org.apache/INFO
http://<ip>:<port>/<contextPath>/log4j/org.apache/ERROR
## 修改logback的root的日誌級別
http://<ip>:<port>/<contextPath>/logback/root/DEBUG
http://<ip>:<port>/<contextPath>/logback/root/INFO
http://<ip>:<port>/<contextPath>/logback/root/ERROR
## 修改logback的org.apache包的日誌級別
http://<ip>:<port>/<contextPath>/logback/org.apache/DEBUG
http://<ip>:<port>/<contextPath>/logback/org.apache/INFO
http://<ip>:<port>/<contextPath>/logback/org.apache/ERROR
3、參考資料
- springboot中動態修改logback日誌級別
https://www.cnblogs.com/heqiyoujing/p/9470752.html - 動態修改日誌級別小工具
https://segmentfault.com/a/1190000013169276 - Spring Boot配置log4j記錄日誌
https://blog.csdn.net/zzq900503/article/details/87629782