Как использовать несколько конфигураций с записью в одном проекте?
Конфигурационный файл для журнала обнаруживается в пути к классам и, следовательно, является специфичным для Eclipse-проекта, чего я не хочу. Я использую несколько утилит Java, все они находятся в одном проекте (это разделяет путь к классам), и мне нужно использовать определенную конфигурацию для некоторых из них.
Я пробовал замену переменных и конфигуратор Joram, но ничего не работало для меня. Вероятно, это была моя ошибка, и я собираюсь решить ее однажды, но сейчас мне нужно простое решение.
Ответы
Ответ 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>