【问题标题】:How to define a variable in Logback with a default value and override it?如何在 Logback 中使用默认值定义变量并覆盖它?
【发布时间】:2017-06-08 13:01:01
【问题描述】:

我想在 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 条件?

【问题讨论】:

  • 请用双引号 (") 包裹您的路径参数。它应该看起来像 -Dlog.dir="foo/logs"
  • @eg04lt3r,谢谢,但这不是问题。
  • 我认为你只能用正确的属性覆盖 logback 文件。请查看此链接stackoverflow.com/questions/32658635/…
  • 这涉及到每个环境有一个不同的logback.xml 文件,这也不是我想做的。据我了解,Logback 支持properties,可以在logback.xml 文件中使用。我希望能够为logback.xml 中的属性定义一个默认值,以防不通过-Dproperty1=.... 从控制台覆盖它。

标签: java maven logback maven-surefire-plugin


【解决方案1】:

如果你需要一个变量,比如说log.file.root,它应该默认为一个值app-logs,定义为:

&lt;property name="LOG_ROOT" value="${log.file.root:-app-logs}" /&gt;

然后在需要的地方使用${LOG_ROOT}

这个变量可以通过命令行覆盖:

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

参考:https://logback.qos.ch/manual/configuration.html -> “变量的默认值”

【讨论】:

    【解决方案2】:

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

    在您的情况下,您希望无论执行的插件如何都绑定该属性。 不仅用于测试执行。

    所以你应该使用在 pom 的 &lt;build&gt; 标签中声明的属性。

    <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 文件夹内(此文件夹或子文件夹)。

    【讨论】:

    • 谢谢,但你说的是Maven资源过滤,我不想做资源过滤。
    • 不客气,但您想用来评估您的财产占位符的方式:&lt;file&gt;${log.dir}/logs/my.log&lt;/file&gt; 看起来像文件过滤功能。
    • 在 Logback 文档中记录了属性/变量,它是比 Maven 过滤更好的解决方案,因为这些值不会在实际资源文件中被替换(这将发生在 Maven 过滤中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多