2017-03-29 238 views
0

我想動態更改所有(大約)我的Web應用程序控制器類的日誌記錄級別。每個進行日誌類包含此代碼:動態更改日誌記錄級別

private static final Logger logger = LoggerFactory 
      .getLogger(HomeController.class); 

我瞭解到,SLF4J不提供設置日誌級別的功能,使人們必須使用底層的log4j:

public static void setLogLevel(String level) { 
    org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger(); 
    logger4j.setLevel(org.apache.log4j.Level.toLevel(level.toUpperCase())); 

    logger.info("Sample Info After setLevel"); 
    logger.debug("Sample Debug After setLevel"); 
    logger.error("Sample Error After setLevel"); 
    logger.trace("Sample Trace After setLevel"); 
    logger.warn("Sample Warn After setLevel"); 
} 

我想法是有一個控制器方法,它可以改變logLevel並將其存儲在數據庫中。我的問題是:如何在不復制和粘貼40多個文件中的所有內容並修改每個控制器方法的情況下如何優雅地解決此問題?還要注意,記錄器代碼是靜態的,而我的數據庫訪問不是靜態的。

回答

1

我怎樣才能解決這個優雅沒有複製和粘貼在40 +文件和修改每個控制器方法的一切?

您可以使用一個控制器方法,以記錄器名稱和所需的日誌級別的查詢參數,並調用LogManager.getLogger(String name)字符串版本。

保存到數據庫並在重新啓動時重新加載當然還有額外的工作要做。

或者,控制器可以更新在啓動時使用的Log4j配置文件,並且強制Log4j在它改變時重新加載它,例如,致電PropertyConfigurator.configure(String configFilename)

+0

我不確定關於Log4J的生命週期,所有tomcat請求是否存在單個實例,或者是否爲每個需要它的請求重新創建了日誌記錄器? – Adder

+0

假設您在'WEB-INF/lib'文件夾中添加了'log4j.jar'(以及所有必需的'slf4j.jar'文件),您的webapp中只有一個Log4j實例。 – Andreas

+0

所以我可以這樣做:'setLogLevel(「INFO」)'它會影響我所有未來的請求和工作? – Adder

0

您可以使用Slf4j並將您的application.properties文件外化。您可以根據需要在此文件中配置日誌記錄級別。

logging.level.com.test=DEBUG 
logging.level.org=INFO 

我不知道爲什麼您需要將此日誌級別存儲在數據庫中。

+0

您似乎錯過了關於*動態更改運行時日誌級別的部分。 – Andreas

相關問題