2016-11-03 41 views
0

我有一個使用log4j2進行日誌記錄的Spring Boot應用程序。我需要在運行時調整日誌記錄級別,並使用一個簡單的RESTful界面來完成此操作,該界面接受記錄器名稱和需要設置的級別。我還需要能夠對日誌記錄級別進行永久更改(僅限某些記錄器)。如何允許用戶對日誌級別進行永久更改?

a)是否有辦法將我的更改保留回log4j配置文件,以便在下一次啓動應用程序時,日誌級別是上一次運行時所處的位置?

b)有沒有辦法讀取配置文件中列出的記錄器列表?

謝謝

+1

您需要將它們寫出來存儲到某種類型的持久性存儲中,例如數據庫。 – chrylis

+0

你的配置通常在你的戰爭/耳朵文件中,所以你不能寫信給它。容器不會讓你。正如@chrylis所說的,你需要將它存儲在容器應用程序可以訪問的持久存儲中。 – markbernard

回答

1

a)如果你有一個配置文件,每一個服務器啓動時,它的時間將用於配置log4j2。你可以創建一個新的配置文件(容器外),並在服務器開始使用它來配置log4j2:

File file = new File("/config/new/log4j2.xml");    
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);  
    ctx.setConfigLocation(file.toURI()); 

或者只是存儲新的信息並修改log4j的編程

B)試試這個:

public Collection<Logger> getLoggers() 

https://logging.apache.org/log4j/2.0/log4j-core/apidocs/org/apache/logging/log4j/core/LoggerContext.html#getLoggers()

這裏的一個代碼示例(在應用程序啓動時執行的):

File file = new File(log4jConfigFilePath);  
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
    ctx.setConfigLocation(file.toURI()); 

    Collection<org.apache.logging.log4j.core.Logger> collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 0 (No loggers instantiated) 

    Logger logger = LoggerFactory.getLogger("myLogger"); 

    collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 1 (myLogger instantiated) 
+0

謝謝@Marco。我的log4j2配置文件在容器外。按照您指定的步驟,我沒有找回在配置文件中列出/配置的記錄器列表。如果我通過了這個障礙,並且允許以編程方式更改記錄器級別,是否有辦法將更改存儲/保留回配置文件?謝謝 – spring5150

+0

getLoggers()返回當前的記錄器,每個實例都應該屬於配置文件中列出的其中一個記錄器。當然,如果你沒有使用LoggerFactory.getLogger(loggerName)創建任何實例,它將返回null。令人遺憾的是,沒有辦法通過編程方式使用log4j2 API來持久化更改。持久化的唯一方法是使用java的文件I/O API –

+0

創建一個新的配置文件(或更新當前的配置文件)getLoggers()不會返回配置文件中的記錄器。我將不得不依靠常規的文件I/O和字符串解析來讀取/解析並計算出來嗎?謝謝 – spring5150

相關問題