首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Log4j 動態修改日誌級別失效:Logger 實例與配置重載機制解析

     編輯:程式設計綜合問答

現象

運行中調用 `logger.setLevel(Level.DEBUG)`,但輸出仍為 INFO 級別。

原因分析

  1. Logger 非單例:每次 `Logger.getLogger("pear")` 可能返回不同實例(取決於類加載器),`setLevel` 修改的不是輸出用的那個。
  2. 配置重載覆蓋:循環中 `PropertyConfigurator.configure(...)` 每 3 秒重載配置,將級別重置為 INFO。
  3. Appender 閾值:ConsoleAppender 自身無級別過濾,但若配置了 `Threshold` 需同步修改。

修正代碼

public class Client {
    private static final Logger logger = Logger.getLogger("pear"); // 靜態單例

    public static void main(String[] args) {
        PropertyConfigurator.configure("log4j.properties"); // 僅啟動時載入一次
        int count = 0;
        while (true) {
            logger.info("日誌信息");
            logger.debug("調試信息");
            try {
                Thread.sleep(3000);
                if (++count == 3) {
                    System.out.println("修改級別為 DEBUG");
                    logger.setLevel(Level.DEBUG); // 修改單例級別
                }
            } catch (InterruptedException e) { e.printStackTrace(); }
        }
    }
}

最佳實踐

  • 生產環境推薦 **Log4j2** + **JMX** 或 **HTTP API** 動態調整級別,無需重啟。
  • 配置文件監聽間隔 (`monitorInterval`) 實現熱加載,而非手動輪詢 `configure`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved