Log4j аварийно завершает работу с NullPointerException, когда системное свойство log4j.configurationFile существует
Я довольно новичок в Log4j2, так что, возможно, это не ошибка, просто я не знаю, как правильно его использовать.
Я хотел бы настроить Log4j2 через файл конфигурации, указанный системным свойством log4j.configurationFile. В моих предыдущих экспериментах я смог настроить log4j2 с правильно размещенным log4j2.xml и работал нормально. Теперь, если системное свойство существует, я получил NullPointerException:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running newpackage.Log4jSyspropProblemTest
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Caused by: java.lang.NullPointerException
at java.io.Writer.write(Writer.java:157)
at java.io.BufferedWriter.newLine(BufferedWriter.java:243)
at java.io.PrintStream.newLine(PrintStream.java:544)
at java.io.PrintStream.println(PrintStream.java:824)
at java.lang.Throwable$WrappedPrintStream.println(Throwable.java:748)
at java.lang.Throwable.printStackTrace(Throwable.java:655)
at java.lang.Throwable.printStackTrace(Throwable.java:643)
at org.apache.logging.log4j.simple.SimpleLogger.logMessage(SimpleLogger.java:165)
at org.apache.logging.log4j.status.StatusLogger.logMessage(StatusLogger.java:220)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1336)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1325)
at org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:551)
at org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:528)
at org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:569)
at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:364)
at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:163)
at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:124)
at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:54)
at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:368)
at org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:56)
at org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:72)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:144)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:80)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:72)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:37)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:468)
at newpackage.Log4jSyspropProblemTest.testLoggerSuccesfullyLoaded(Log4jSyspropProblemTest.java:44)
... 30 more
Я понятия не имею. Кажется, все хорошо для меня. Вот мой файл свойств "src/main/resources/AppProperties.properties":
log4j.configurationFile=src/main/resources/log4j2_custom.xml
Соответствующая часть src/main/resources/log4j2_custom.xml:
<configuration status="info" monitorIntervall="30" strict="true">
<properties>
<Property name="filename">logs/myLog.log</Property>
</properties>
<appenders>
<appender type="File" name="fileAppender" filename="${filename}">
<layout type="PatternLayout">
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</layout>
</appender>
</appenders>
<loggers>
<logger name="fileLogger">
<appenderRef ref="fileAppender"/>
</logger>
</loggers>
</configuration>
Тесты:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jSyspropProblemTest {
private Logger fileLogger;
private static final String PROPERTIES_FILE = "src/main/resources/AppProperties.properties";
private static final String LOG4J_CONFIGURATION_PROPERTY_NAME = "log4j.configurationFile";
@Test
public void testPropertyIsValid(){
final String configFile = System.getProperty(LOG4J_CONFIGURATION_PROPERTY_NAME);
Assert.assertNotNull(configFile);
Assert.assertTrue(new File(configFile).exists());
}
@Test
public void testLoggerSuccesfullyLoaded(){
fileLogger = LogManager.getLogger("fileLogger");
Assert.assertNotNull(fileLogger);
}
}
И, наконец, вот зависимости из pom.xml:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
Пожалуйста, дайте мне знать, если вы что-то нашли. Любая идея с благодарностью.
1 ответ
Я наконец понял, что проблема совершенно не связана с Log4j2. Когда я намеревался добавить свойство к системным свойствам, я случайно очистил все системные свойства, кроме файла log4j.configurationFile. Это было основной причиной всех странных исключений, возникших в JDK.