1. 程式人生 > 其它 >log4j日誌工具類

log4j日誌工具類

技術標籤:# java工具類log4jjava無配置日誌

工具類:

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>