Как использовать несколько конфигураций с logback в одном проекте? - PullRequest
41 голосов
/ 15 июля 2011

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

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

Ответы [ 3 ]

63 голосов
/ 15 июля 2011

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

ОПЦИЯ 2: используйте подстановку переменных, чтобы задать имя файла журнала с системным свойством.Например:

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

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

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

ВАРИАНТ 4: добавить / удалить аппендер, передав параметр командной строки системных свойств в java.Это позволит вам войти в разные места.Обратите внимание, что для условной обработки требуется janino .Например:

  1. Поместите это в свой конфигурационный файл logback, куда бы вы ни положили <appender-ref>, изменив значение ref на одно из ваших <appender>, конечно: <if condition="property("mycompany.logging.console").equalsIgnoreCase("true")"> <then><appender-ref ref="STDOUT"/></then></if>
  2. Если вы хотите включить этот appender, передайте следующее в java при запуске этого приложения:-Dmycompany.logging.console=true

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

1 голос
/ 05 января 2019

В приложении 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>
  ...
0 голосов
/ 16 июля 2019

Я использовал другую опцию, основанную на блоге 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>
...