log4j日誌工具類
阿新 • • 發佈:2020-12-21
工具類:
import java.util.Objects;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
/**
* log4j日誌工具類
* @author zql
* @createTime 2020-12-13 22:49:28
* @version 1.0
*
*/
public class LogUtil {
/**
* 預設日誌級別Level.INFO
*/
private static Level LEVEL = Level.INFO;
/**
* 日誌最低輸出級別
*/
private static Level PRIORITY = Level.INFO;
/**
* 日誌輸出編碼UTF-8
*/
private static String ENCODING = "utf-8";
/**
* 用於獲取一個以當前執行緒名命名的logger
* @author zql
* @createTime 2020-12-13 22:51:11
*
* @return
*/
public static Logger getLogger() {
String code = Thread.currentThread().getName();
// 判斷logger是否已經存在,logger存在且該logger已配置code命名appender則直接返回
if (Objects.nonNull(LogManager.exists(code))) {
Logger logger = LogManager.getLogger(code);
if (Objects.nonNull(logger)) {
return logger;
}
}
// 生成logger
Logger logger = LogManager.getLogger(code);
// 不繼承父類的Additivity
logger.setAdditivity(true);
// 設定日誌級別
logger.setLevel(LogUtil.LEVEL);
// 生成新的Additivity
RollingFileAppender appender = new RollingFileAppender();
// 重新命名appender
appender.setName(code);
// log的輸出形式
PatternLayout layout = new PatternLayout();
String cp = "[ %p ] [%d{yyyy-MM-dd HH:mm:ss,SSS} %l ]:%m%n";
layout.setConversionPattern(cp);
appender.setLayout(layout);
// 日誌輸出路徑,實際通過專案配置檔案進行讀取
String logOutPath = "E:\\logs\\";
appender.setFile(logOutPath + code + ".log");
// log檔案備份數量
appender.setMaxBackupIndex(10);
// log檔案大小
appender.setMaxFileSize("30MB");
// log的文字碼
appender.setEncoding(LogUtil.ENCODING);
// 設定日誌資訊的最低輸出級別
appender.setThreshold(LogUtil.PRIORITY);
// true:在已存在log檔案後面追加,false:新log覆蓋以前的log
appender.setAppend(true);
// 適用當前的配置
appender.activateOptions();
// 預設不輸出到控制檯,實際通過專案配置檔案進行讀取
boolean isOutConsole = true;
ConsoleAppender console = null;
if (isOutConsole) {
console = new ConsoleAppender();
// 設定控制檯最低輸出級別
console.setThreshold(Level.DEBUG);
console.setLayout(layout);
console.setEncoding(LogUtil.ENCODING);
console.activateOptions();
}
// 將新的Appender設定到Logger中,利用同步程式碼塊防止多執行緒環境下,同一個logger下加入兩個同名appender,導致日誌重複列印
synchronized(LogUtil.class) {
if (Objects.isNull(logger.getAppender(code))) {
logger.addAppender(appender);
}
if (isOutConsole) {
logger.addAppender(console);
}
}
return logger;
}
/**
* 重置當前執行緒名
* @author zql
* @createTime 2020-12-13 23:14:49
*
* @param code
*/
public static void resetThreadName(String code) {
Thread.currentThread().setName(code);
}
/**
* 重置日誌列印級別
* @author zql
* @createTime 2020-12-13 23:17:01
*
* @param level
*/
public static void setLevel(Level level) {
LogUtil.LEVEL = level;
}
/**
* 重置日誌最低輸出級別
* @author zql
* @createTime 2020-12-13 23:19:16
*
* @param priority
*/
public static void setPriority(Level priority) {
LogUtil.PRIORITY = priority;
}
}
測試類:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import sun.rmi.runtime.Log;
/**
* log4j日誌工具測試類
* @author zql
* @createTime 2020-12-13 22:49:28
* @version 1.0
*
*/
public class LogUtilTest {
public static void main(String[] args) {
Logger logger = LogUtil.getLogger();
logger.info("測試info");
logger.error("測試error");
// 重置日誌列印輸出級別
LogUtil.setLevel(Level.DEBUG);
LogUtil.setPriority(Level.DEBUG);
// 把DEBUG日誌級別的列印到debug.log日誌檔案下
LogUtil.resetThreadName("debug");
LogUtil.getLogger().debug("測試debug");
}
}
普通專案需要引入的包
log4j-1.2.17.jar
maven專案依賴
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>