動態修改Log4J和Logback的日誌級別

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