Как определить переменную в Logback со значением по умолчанию и переопределить ее?

Я хотел бы определить свойство/переменную в Logback (1.2.1), которое:

  • Имеет значение по умолчанию
  • Можно переопределить с помощью параметра командной строки Java.

По сути, во время разработки я бы хотел, чтобы Maven вызывал maven-surefire-plugin примерно так:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <systemPropertyVariables>
            <log.dir>${project.build.directory}/logs</log.dir>
        </systemPropertyVariables>
    </configuration>
</plugin>

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

На данный момент у меня есть следующие logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds" debug="false">

    <property name="log.dir" value="."/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.dir}/logs/my.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>strongbox_%d{yyyy-MM-dd}.%i.log</fileNamePattern>

            <fileNamePattern>strongbox-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>128MB</maxFileSize>
            <maxHistory>31</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>

            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{HH:mm:ss.SSS dd-MM-yyyy} | %-5.5p | %-20.20t | %-50.50logger{50} | %m%n</pattern>
        </encoder>
    </appender>
    ...
</configuration>

-Dlog.dir=foo/logs просто игнорируется, и файл журнала создается в текущем каталоге. Что я здесь делаю неправильно? Нужен ли размах? Нужно ли устанавливать условие if?


person carlspring    schedule 08.06.2017    source источник
comment
Пожалуйста, оберните аргумент пути двойной кавычкой (). Это должно выглядеть так: -Dlog.dir=foo/logs   -  person eg04lt3r    schedule 08.06.2017
comment
@ eg04lt3r, спасибо, но проблема не в этом.   -  person carlspring    schedule 08.06.2017
comment
Я думаю, что вы можете переопределить файл журнала только с правильным свойством. Пожалуйста, проверьте эту ссылку stackoverflow.com/questions/32658635/.   -  person eg04lt3r    schedule 08.06.2017
comment
Это включает в себя наличие разных файлов logback.xml для каждой среды, что также не является тем, что я хотел бы делать. Насколько я понимаю, Logback поддерживает properties, который можно использовать внутри файла logback.xml. Я хотел бы иметь возможность определить значение по умолчанию для свойства внутри logback.xml для случаев, когда это не переопределяется с консоли через -Dproperty1=.....   -  person carlspring    schedule 08.06.2017


Ответы (2)


Если вам нужна переменная, скажем, с именем log.file.root, которая по умолчанию должна иметь значение app-logs, определите ее как:

<property name="LOG_ROOT" value="${log.file.root:-app-logs}" />

Затем используйте ${LOG_ROOT} везде, где вам нужно.

Эту переменную можно переопределить через командную строку:

-Dlog.file.root=/home/user/logs

Ссылка: https://logback.qos.ch/manual/configuration.html -> "Значения по умолчанию для переменных"

person Sujay Anjankar    schedule 26.01.2018

Вы указываете свойство для maven-surefire-plugin.
Таким образом, свойство будет привязано только к выполнению этого плагина:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <systemPropertyVariables>
            <log.dir>${project.build.directory}/logs</log.dir>
        </systemPropertyVariables>
    </configuration>
</plugin>

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

Поэтому вы должны использовать свойства, объявленные в теге <build> файла pom.

<build>
      ...
  <properties>
     <log.dir>${project.build.directory}/logs</log.dir>
  </properties>
      ...
</build>

Чтобы свойство Maven, используемое в конфигурации журнала, было заменено фактическим значением, вычисленным из pom, вы должны включить фильтрацию ресурсов Maven:

  ...
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
  ...

И конфигурация Logback должна быть расположена внутри папки src/main/resources, конечно (эта папка или дочерняя).

person davidxxx    schedule 08.06.2017
comment
Спасибо, но вы говорите о фильтрации ресурсов Maven, а я не собираюсь заниматься фильтрацией ресурсов. - person carlspring; 08.06.2017
comment
Добро пожаловать, но способ, которым вы хотите использовать значение вашего заполнителя свойства: <file>${log.dir}/logs/my.log</file> выглядит как функция фильтрации файлов. - person davidxxx; 08.06.2017
comment
Это задокументировано в документах Logback для свойств/переменных, и это лучшее решение, чем фильтрация Maven, поскольку значения не заменяются в фактическом файле ресурсов (что и произойдет с фильтрацией Maven). - person carlspring; 08.06.2017