我有一個在 xml 中定義 log4j 屬性的專案。
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
<Appenders>
<File name="LogFileAppender" fileName="${sys:logFileName:-default}" append="false">
<PatternLayout>
<Pattern>%d [%t] %p - %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="LogFileAppender"/>
</Root>
</Loggers>
</Configuration>
在發生任何日志記錄以獲取正確的輸出檔案夾之前,我將fileName值更新為代碼中的正確路徑。
public static void initializeLoggers(String logPath)
{
// set output paths for log files
System.setProperty("logFileName", logPath "PROJECT.log");
// reconfigure loggers with paths
org.apache.logging.log4j.core.LoggerContext ctx =
(org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
}
在大多數情況下,一切都按預期作業。日志檔案輸出到正確的 logPath 并寫出資料。但是,在我們到達 initializeLoggers() 之前,默認專案目錄中創建了一個名為“default”的檔案,因為呼叫
static Logger log = LogManager.getLogger(MyClass.class); // Logging
在代碼的頂部。
我發現不生成“默認檔案”,只需將欄位留為空白,如下所示:
fileName="${sys:logFileName:-}"
但是這樣做代碼會抱怨并給出錯誤,因為該屬性在特定時間為空。
2022-01-19 13:07:51,936 主要錯誤引數為空:檔案名 2022-01-19 13:07:51,944 主要錯誤無法創建型別為 org.apache.logging.log4j.core.appender.FileAppender 的插件對于元素檔案 org.apache.logging.log4j.core.config.ConfigurationException:為元素檔案提供的引數無效:欄位“檔案名”在 org.apache.logging.log4j.core.config.plugins.util 處具有無效值“” .PluginBuilder.injectFields(PluginBuilder.java:210)
有什么辦法可以解決這個問題
- 不生成未使用的“默認檔案”
- 沒有關于空值的錯誤
uj5u.com熱心網友回復:
如果你想延遲 Log4j 的初始化,你需要小心控制LogManager.getLogger和類似方法的使用。例如,您不應在主類中使用靜態Logger欄位,而應僅在初始化日志記錄后呼叫。LogManager.getLogger
這可能有點棘手,但系統屬性log4j2.loggerContextStacktraceOnStart可以幫助您。
一種更簡單的方法是將組態檔移到自動配置程序之外,例如通過呼叫它myapp-log4j2.xml。這樣,第一個配置將使用默認配置(僅使用控制臺附加程式),您可以在設定適當的系統變數后重新配置它:
private static final String CONFIG_FILE = "myapp-log4j2.xml";
public static void initializeLoggers(String logPath) {
final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
final ClassLoader cl = SomeClass.class.getClassLoader();
final URL resource = tccl != null ? tccl.getResource(CONFIG_FILE)
: cl != null ? cl.getResource(CONFIG_FILE) : ClassLoader.getSystemResource(CONFIG_FILE);
if (resource != null) {
System.setProperty("logFileName", logPath "PROJECT.log");
Configurator.reconfigure(resource.toURI());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/418192.html
標籤:
