Log4J 2 значения поиска используются в конфигурации до их загрузки / представления - PullRequest
0 голосов
/ 18 мая 2018

Я использую поиск SystemPropertiesLookup для настройки моей конфигурации Log4J2.Системные свойства устанавливаются в первой строке моего основного метода.Проблема в том, что когда Log4J загружает конфигурацию, основной метод еще не вызывается, и поэтому системные свойства еще не заполнены.

Вот мой log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" packages="org.base">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d [%c{1}] %-5level: %msg%n}{STYLE=Logback}"/>
        </Console>

        <File name="AppLog" fileName="logs/app-${sys:MIGRATION_ENV:-UNKNOWN}-${sys:MIGRATION_TITLE:-UNKNOWN}.log" append="false">
            <PatternLayout pattern="%d [%c{1}] %-5level: %msg%n"/>
        </File>
    </appenders>

    <loggers>
        <root level="error">
            <appender-ref ref="Console" level="error"/>
            <appender-ref ref="AppLog" level="error"/>
        </root>
        <logger name="org.base" level="debug" additivity="false">
            <appender-ref ref="Console" level="debug"/>
            <appender-ref ref="AppLog" level="debug"/>
        </logger>
    </loggers>
</configuration>

Файл будет называться app-UNKNOWN-UNKNOWN, потому что когда Log4J заполняет его, свойства еще не доступны.

Есть ли способ заставить Log4J ждать, желательно без переноса конфигурации в код Java?

Свойства должны быть установлены во время выполнения (первая строка основного метода).

Возможным решением может быть только вызов getLogger(..) ПОСЛЕ этого метода вместо его инициализации с помощьюпеременная, но она не совсем подходит для моей задачи.

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете делать что хотите, используя RoutingAppender.Вот пример кода:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;


public class SomeClass {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        System.setProperty("myProperty", "myFile.log");

        if(log.isDebugEnabled())
            log.debug("This is some debug!");
        log.info("Here's some info!");
        log.error("Some erorr happened!");
    }
}

Вот log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <Routing name="Routing">
            <Routes pattern="$${sys:myProperty}">
            <Route>
                <File name="File" fileName="logs/${sys:myProperty}"
                    immediateFlush="false" append="false">
                    <PatternLayout
                        pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
                </File>
            </Route>

            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" level="debug" />
            <AppenderRef ref="Routing" level="debug" />
        </Root>
    </Loggers>
</Configuration>

При выполнении вышеуказанного кода Java создается файл myFile.log в папке журналов в текущемрабочий каталог.Содержимое файла журнала выглядит примерно так:

2018-05-21 22:13:29.147 [main] DEBUG example.SomeClass - This is some debug!
2018-05-21 22:13:29.160 [main] INFO  example.SomeClass - Here's some info!
2018-05-21 22:13:29.161 [main] ERROR example.SomeClass - Some erorr happened!
...