Одинаковый log4j2. xml для разных java процессов с отдельным уровнем журнала - PullRequest
0 голосов
/ 26 мая 2020

Проблема

Я хочу стандартизировать свою log4j2.xml настройку для нескольких Java процессов, которые я запускаю на разных linux серверах. Мое жесткое условие: единый log4j2.xml для всех серверов.

Иногда требуется, чтобы я изменил свой loglevel с INFO на DEBUG, пока выполняется процесс Java. Вы можете сделать это, изменив logLevel в log4j2.xml, пока у вас настроено monitorInterval.

Однако это изменяет loglevel ВСЕХ процессов, запущенных на этом сервере! Мне нужно решение, в котором я могу изменить logLevel для одного процесса.

Моя первая попытка

Я подумал, что переместу logLevel в свойства. Предположим, у меня есть log4j2.xml (в качестве примера):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${bundle:logger:logLevel}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Рядом с этим у меня также есть файл logger.properties в пути к классам:

logLevel=INFO

Теперь, когда я измените мой log4j2.xml (просто добавив где-нибудь пробел) и обновив этот файл свойств, журнал изменится. Однако, как уже упоминалось, это изменяет logLevel ВСЕХ процессов.

Что я хочу

Я хочу иметь logger.properties, который выглядит так:

process1LogLevel=INFO
process2LogLevel=DEBUG

А затем что-то в log4j2.xml, которое динамически настраивает это свойство:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="30">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${bundle:logger:<something based on the process name>}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Однако это «гибкое» свойство на самом деле не работает. Есть ли у вас идея решения?

Примечание

Если у вас есть другая идея, которая выглядит немного иначе, но позволяет достичь моих целей, это тоже хорошо! Всегда приветствуются любые нестандартные решения :)

1 Ответ

0 голосов
/ 26 мая 2020

Нашел. Вы можете вкладывать свойства. Если вы укажете, например, -Dname=process1, вы можете использовать его так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration monitorInterval="1">
    <Properties>
        <Property name="process1">DEBUG</Property>
        <Property name="process2">INFO</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %t %-5p %-32c{1} - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="${${sys:name}}">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
...