Log4j, отключить приложения, зависящие от среды

Я хотел бы иметь одну конфигурацию log4j.xml и иметь возможность подключаться к консоли при разработке моего приложения. После развертывания в среде я хочу только регистрироваться в приложении, а не в консоли. Как я могу достичь этого?

Это моя текущая конфигурация:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="DEBUG" />
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${log-base-dir}/${adapter-name}.log" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="MaxBackupIndex" value="99" />
        <param name="append" value="true" />        
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="info" />
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="LogFileAppender" />
    </root>

</log4j:configuration>

Ответ 1

Одним из решений может быть разделение конфигурационных файлов log4j для среды разработки и производства, например:

  • log4j-development.xml - для среды разработки
  • log4j-production.xml - для производственной среды

Тогда ваша команда запуска приложения может иметь параметр, задающий конфигурационный файл log4j, например. java -Dlog4jconfig=log4j-development.xml -jar Application.jar

Вы можете настроить log4j, получив значение свойства log4jconfig в вашем коде, например. System.getProperty("log4jconfig").

Плюсы этого решения заключаются в следующем:

  • Вы можете самостоятельно определять регистраторы (ConsoleAppender и LogFileAppender в разработке и только LogFileAppender)
  • Вы можете указать уровень ведения журнала для каждой среды (например, error в процессе производства и debug в разработке)
  • Вы можете настроить регистратор файлов самостоятельно, например. вести журналы за X дней в производстве (для целей аудита и т.д.) и иметь только один файл журнала в разработке и т.д.

Этот шаблон используется во многих серверах приложений, где у вас несколько сред (разработка, UAT, постановка, производство и т.д.).

Пример log4j-development.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="DEBUG" />
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="debug" />
        <appender-ref ref="ConsoleAppender" />
    </root>

</log4j:configuration>

Пример log4j-production.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${log-base-dir}/${adapter-name}.log" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="MaxBackupIndex" value="99" />
        <param name="append" value="true" />        
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="error" />
        <appender-ref ref="LogFileAppender" />
    </root>

</log4j:configuration>

Ответ 2

Это легко сделать, используя параметр appender Threshold и системное свойство JVM. Например.

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="${my.console.level}" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" />
    </layout>
</appender>

Затем при запуске приложения на prod используйте -Dmy.console.level=OFF

В то же время при локальном использовании -Dmy.console.level=ALL

Оба OFF и ALL являются допустимыми уровнями log4j.