我有一個使用log4j2進行日誌記錄的Spring Boot應用程序。我需要在運行時調整日誌記錄級別,並使用一個簡單的RESTful界面來完成此操作,該界面接受記錄器名稱和需要設置的級別。我還需要能夠對日誌記錄級別進行永久更改(僅限某些記錄器)。如何允許用戶對日誌級別進行永久更改?
a)是否有辦法將我的更改保留回log4j配置文件,以便在下一次啓動應用程序時,日誌級別是上一次運行時所處的位置?
b)有沒有辦法讀取配置文件中列出的記錄器列表?
謝謝
我有一個使用log4j2進行日誌記錄的Spring Boot應用程序。我需要在運行時調整日誌記錄級別,並使用一個簡單的RESTful界面來完成此操作,該界面接受記錄器名稱和需要設置的級別。我還需要能夠對日誌記錄級別進行永久更改(僅限某些記錄器)。如何允許用戶對日誌級別進行永久更改?
a)是否有辦法將我的更改保留回log4j配置文件,以便在下一次啓動應用程序時,日誌級別是上一次運行時所處的位置?
b)有沒有辦法讀取配置文件中列出的記錄器列表?
謝謝
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()
這裏的一個代碼示例(在應用程序啓動時執行的):
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)
謝謝@Marco。我的log4j2配置文件在容器外。按照您指定的步驟,我沒有找回在配置文件中列出/配置的記錄器列表。如果我通過了這個障礙,並且允許以編程方式更改記錄器級別,是否有辦法將更改存儲/保留回配置文件?謝謝 – spring5150
getLoggers()返回當前的記錄器,每個實例都應該屬於配置文件中列出的其中一個記錄器。當然,如果你沒有使用LoggerFactory.getLogger(loggerName)創建任何實例,它將返回null。令人遺憾的是,沒有辦法通過編程方式使用log4j2 API來持久化更改。持久化的唯一方法是使用java的文件I/O API –
創建一個新的配置文件(或更新當前的配置文件)getLoggers()不會返回配置文件中的記錄器。我將不得不依靠常規的文件I/O和字符串解析來讀取/解析並計算出來嗎?謝謝 – spring5150
您需要將它們寫出來存儲到某種類型的持久性存儲中,例如數據庫。 – chrylis
你的配置通常在你的戰爭/耳朵文件中,所以你不能寫信給它。容器不會讓你。正如@chrylis所說的,你需要將它存儲在容器應用程序可以訪問的持久存儲中。 – markbernard