Подтвердить что ты не робот

Как использовать несколько конфигураций с записью в одном проекте?

Конфигурационный файл для журнала обнаруживается в пути к классам и, следовательно, является специфичным для Eclipse-проекта, чего я не хочу. Я использую несколько утилит Java, все они находятся в одном проекте (это разделяет путь к классам), и мне нужно использовать определенную конфигурацию для некоторых из них.

Я пробовал замену переменных и конфигуратор Joram, но ничего не работало для меня. Вероятно, это была моя ошибка, и я собираюсь решить ее однажды, но сейчас мне нужно простое решение.

4b9b3361

Ответ 1

ВАРИАНТ 1: укажите расположение файла конфигурации журнала с системным свойством logback.configurationFile. Это фактически позволяет вам иметь несколько файлов конфигурации для каждого проекта. В соответствии с документацией по журналу значение этого свойства может быть URL-адресом, ресурсом в пути к классу или путём к файлу, внешнему по отношению к приложение. Например:
-Dlogback.configurationFile=/path/to/config.xml

ВАРИАНТ 2: используйте подстановку переменных, чтобы установить имя файла журнала с системным свойством. Например:

  • Ваш appender может установить файл следующим образом:
    <file>/var/tmp/${mycompany.myapplication}.log</file>
  • И тогда вы можете указать значение этой переменной при запуске java:
    -Dmycompany.myapplication=SomeUtility

ВАРИАНТ 3: установите уровень регистратора с системным свойством. Это позволит вам регистрироваться больше/меньше. Например:

  • Поместите это в свой конфигурационный файл журнала:
    <logger name="com.mycompany" level="${mycompany.logging.level:-DEBUG}"/>
    Это приводит к тому, что указанный пакет регистрируется на уровне DEBUG по умолчанию.
  • Если вы хотите изменить уровень ведения журнала на INFO в конкретном приложении, затем передайте следующее в java при запуске этого приложения:
    -Dmycompany.logging.level=INFO

ВАРИАНТ 4: добавьте/удалите приложение, передав параметр командной строки системного свойства в java. Это позволит вам регистрироваться в разных местах. Обратите внимание, что для <if condition="property("mycompany.logging.console").equalsIgnoreCase("true")"> <then><appender-ref ref="STDOUT"/></then></if> Если вы хотите включить этот appender, то передайте следующее в java при запуске этого приложения:
-Dmycompany.logging.console=true

Что касается свойств системы, вы передаете их в java как аргументы -D, например,
java -Dmy.property=/path/to/config.xml com.mycompany.MyMain

Ответ 2

В приложении Spring Boot вы можете ссылаться на Spring Profiles внутри файла конфигурации logback.

Смотрите эту статью.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <springProfile name="dev">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>
          %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n
        </pattern>
        <charset>utf8</charset>
      </encoder>
    </appender>
    <root level="DEBUG">
      <appender-ref ref="CONSOLE"/>
    </root>
  </springProfile>
  ...

Ответ 3

Я использовал другой вариант, основанный на блоге Leonidas. Существует необязательный файл свойств (environment.properties), который содержит свойство среды и пользовательские конфигурации (например, logback-env-test.xml). Все эти файлы должны быть на пути к классам.

Если файл свойств существует и определяет свойство logEnv например

logEnv = dev66

logback пытается найти и включить пользовательскую конфигурацию из logback-env-dev66.xml

<included>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</included>

В противном случае это будет возврат к конфигурации по умолчанию (раздел <else>). Обратите внимание, что <included> использует вместо <configuration> в пользовательских файлах конфигурации.

logback.xml для управления всеми вышеперечисленными вещами:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="true">
    <!-- To skip error if property file doesn't exist -->
    <define name="propExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
        <resource>environment.properties</resource>
    </define>
    <if condition='${propExists}'>
        <then>
            <property resource="environment.properties" />
        </then>
    </if>
    <!-- If specific configuration exists, load it otherwise fallback to default (<else> section)  -->
    <define name="confExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
        <resource>logback-env-${logEnv}.xml</resource>
    </define>
    <if condition='${confExists}'>
        <then>
            <include resource="logback-env-${logEnv}.xml"/>
        </then>
        <else>
            <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="STDOUT" />
            </root>
        </else>
    </if>
</configuration>