2017-06-08 119 views
0

我想在的logback來定義屬性/變量(1.2.1),其:如何使用默認值在Logback中定義變量並覆蓋它?

  • 具有默認值
  • 可以通過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條件?

+0

請換用逗樂引號(「)的路徑參數應該看起來像-Dlog.dir =「foo/logs」 – eg04lt3r

+0

@ eg04lt3r,謝謝,但這不是問題。 – carlspring

+0

我認爲你只能用正確的屬性覆蓋logback文件。請檢查此鏈接https://stackoverflow.com/questions/32658635/how-do-i-load-different-logback-configuration-for-maven-surefire-and-eclipse。 – eg04lt3r

回答

1

您指定maven-surefire插件的屬性。
那麼該屬性將僅適用於該插件運行的約束:

<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> 

在你的情況,你想要的屬性綁定無論執行插件。 不僅用於測試執行。

因此,您應該使用pom的<build>標記中聲明的屬性。

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

爲了使在的logback配置中使用的Maven的屬性通過從POM計算出的實際值來替換,則必須使Maven的資源過濾:

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

而的logback配置具有當然是位於src/main/resources文件夾內(此文件夾或孩子)。

+0

謝謝,但你在談論的是Maven資源過濾,我不打算做資源過濾。 – carlspring

+0

歡迎您訪問,但您希望使用這種方式來評估您的媒體資源佔位符:' $ {log.dir} /logs/my.log'看起來像文件過濾功能。 – davidxxx

+0

它在Logback文檔中記錄了屬性/變量,它比Maven過濾更好的解決方案,因爲在實際資源文件中不會替換值(Maven過濾將會發生這種情況)。 – carlspring

1

如果您需要一個變量,說叫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 - >「默認變量值」