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

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

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


person maaartinus    schedule 14.07.2011    source источник
comment
Какова конкретная конфигурация, которая вам нужна для ваших различных частей?   -  person Ryan Stewart    schedule 15.07.2011
comment
Ничего особенного... в некоторых утилитах мне нужно регистрировать больше, в других - меньше. Это самая важная часть для меня. Я также хочу перенаправить вывод в разные файлы (в идеале на основе основного класса).   -  person maaartinus    schedule 15.07.2011
comment
Похоже, вы должны иметь возможность управлять всем этим из одного файла конфигурации. Я не уверен, что вы подразумеваете под специфичным для проекта Eclipse битом в своем вопросе. Можете ли вы уточнить, что именно вы после?   -  person Ryan Stewart    schedule 15.07.2011
comment
@ Райан Стюарт Я не вижу способа управлять им из одного файла конфигурации. Есть классы Main1 и Main2. Для них я использую разные логгеры и могу устанавливать разные уровни логирования. Это нормально. Но оба они используют класс Common1, для которого мне нужно установить уровень логирования в соответствии с тем, какой из Main* классов является основным классом (т.е. какая программа была запущена).   -  person maaartinus    schedule 15.07.2011
comment
@Ryan Stewart Под специфическим для проекта Eclipse я просто имею в виду, что для каждого проекта Eclipse существует один путь к классам, и, следовательно, для каждого проекта Eclipse существует один файл конфигурации журнала. Это нормально, если в проекте нет нескольких основных классов, для которых вы хотите по-разному вести подробный журнал.   -  person maaartinus    schedule 15.07.2011
comment
Из любопытства, вы попробовали какой-нибудь из вариантов, которые я предложил? У вас все еще есть проблема с конфигурацией ведения журнала?   -  person jtoberon    schedule 22.07.2011
comment
Извините, у меня пока нет времени, но я уверен, что это решит мою проблему. Ваш ответ действительно потрясающий. Я прокомментирую это, как только у меня будет время, чтобы попробовать это.   -  person maaartinus    schedule 22.07.2011
comment
Мне грустно говорить, что я действительно использовал все эти варианты на протяжении многих лет :)   -  person jtoberon    schedule 22.07.2011


Ответы (3)


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

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

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

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

  1. Поместите это в файл конфигурации журнала:
    <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. Если вы хотите включить это приложение, передайте в java следующее при запуске этого приложения:
    -Dmycompany.logging.console=true

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

person jtoberon    schedule 15.07.2011
comment
Хороший список! Другой вариант: logback поддерживает программную настройку. Если точкой дифференциации в приложении являются основные классы, эти классы могут сами настроить logback. - person Ryan Stewart; 15.07.2011
comment
В варианте 4 вы начали условие с, но оно должно быть ' - person D.Tomov; 12.12.2018

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

См. эту статью.

<?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>
  ...
person Agustí Sánchez    schedule 05.01.2019

Я использовал другой вариант, основанный на блоге Леонида . Есть два файла:

  • необязательный файл свойств (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>

Это позволит вам иметь отдельную конфигурацию для всех сред, определять собственную пользовательскую конфигурацию (например, локальную разработку) без влияния на других.

person foal    schedule 16.07.2019