我在 java 應用程式中運行 log4j2 日志記錄,但在設定方面沒有最大的靈活性。我們log4j2.xml的應用程式的類路徑中有一個現有的組態檔,它存在于一個可執行的 jar 中。我可以修改 jar 但不能修改呼叫它的內容或在它之外的內容(我無法控制環境)。我想在 jar 之外添加一個可選的覆寫 log4j2 組態檔。當它存在時,它會覆寫 log4j2.xml,當它不存在時,將使用 log4j2.xml。所以我將此屬性添加到log4j2.component.properties檔案中:
log4j.configurationFile=../conf/log4j2-override.xml
當我創建這個可選檔案時,它作業得很好。當我不創建此檔案時,log4j2 會列印出找不到該檔案的錯誤,然后無法回退到log4j2.xml類路徑中的現有檔案。將特定于類路徑的檔案添加到 configurationFile 屬性似乎并不重要。組態檔肯定是可用的,因為如果我完全洗掉該屬性,它將使用 jar 類路徑中的配置。
log4j2 似乎在查找檔案時出錯并停止自動配置序列而不是繼續。無論如何,如果我選擇不這樣做,我是否可以選擇覆寫默認配置 xml 檔案而不要求它出現在 jar 之外?我希望從 jar 檔案中指定這一點,而不是要求根據檔案的存在來更改呼叫 jar 的方式。
uj5u.com熱心網友回復:
該log4j.configurationFile屬性允許您指定一個以逗號分隔的配置源串列,這些配置源將使用合并策略進行合并(參見DefaultMergeStrategy默認規則)。在您的情況下,您可以使用:
log4j.configurationFile=classpath:log4j2.xml,../conf/log4j2-override.cml
丟失的檔案將被忽略,并向狀態記錄器發送警告。
Log4j 2.13.x 受到錯誤LOG4J2-2901 的影響,如果檔案丟失,它會停止配置程序。因此請務必使用最新版本。
uj5u.com熱心網友回復:
Piotr 的回答解決了自動配置序列不起作用的直接原因,但它仍然列印了對我的用例不起作用的警告訊息。所以這里有一種替代方法來處理我對環境的約束(限制對 jar 檔案本身的修改并且沒有控制臺輸出)。
基本上只是有條件地在代碼本身中設定記錄器組態檔。我有一個 application.properties 檔案,不幸的是它沒有加載到 spring 配置中,所以我真的必須手動執行此操作。您可以有條件地log4j.configurationFile從標準外部 spring application.properties 檔案中指定屬性,甚至不使用此代碼。
import java.io.File;
import org.apache.logging.log4j.core.LoggerContext;
Properties props = new EncryptableProperties(encryptor);
if (props.getProperty("log4j.configurationFile") != null) {
LoggerContext loggerContext = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File(props.getProperty("log4j.configurationFile"));
loggerContext.setConfigLocation(file.toURI());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/354792.html
