logback.xml中属性的空默认字符串

时间:2017-06-21 09:24:21

标签: spring-boot logback

我们关于logback.xml的项目结构如下:

src\main\resources\logback.xml
src\main\resources\config\dev\logback.xml
src\main\resources\config\sjngm\dev\logback.xml
src\main\resources\config\int\logback.xml
src\main\resources\config\local\logback.xml
src\main\resources\config\prod\logback.xml

其中第一个引用特定于环境的一个:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <contextName>sjngm</contextName>
  <jmxConfigurator />
  <include resource="config/${extra}${env:-local}/logback.xml" />
</configuration>

请注意,extra大部分时间都没有定义,这就是为什么暂时使用它的原因:

  <include resource="config/${extra:-}${env:-local}/logback.xml" />

这一点停止了工作,无法记住哪个版本的logback。所以我们将其改为

  <include resource="config/${extra:-./}${env:-local}/logback.xml" />

也工作了很长一段时间。

现在我们切换到Spring Boot 1.5.4(包含logback-classic 1.1.11和logback-core 1.1.11),它又停止了工作。最新的错误消息是:

11:08:15,020 |-WARN in ch.qos.logback.core.joran.action.IncludeAction - Could not find resource corresponding to [config/./local/logback.xml]

如果我回到

  <include resource="config/${extra:-}${env:-local}/logback.xml" />

消息是

11:19:28,778 |-WARN in ch.qos.logback.core.joran.action.IncludeAction - Could not find resource corresponding to [config/extra_IS_UNDEFINEDlocal/logback.xml]

请注意,logback仍然使用&#34; local&#34;作为env的默认字符串,所以并非所有字符串都被破坏。

我现在该怎么办?基本上我想告诉logback我想要一个extra所在的空字符串。

2 个答案:

答案 0 :(得分:0)

这也不起作用:

<property name="defaultExtra" value="" />
<include resource="config/${extra:-${defaultExtra}}${env:-local}/logback.xml" />

作为空字符串似乎总是导致未定义的属性。

我能想到的唯一工作是:

<if condition='isDefined("extra")'>
  <then>
    <include resource="config/${extra}${env:-local}/logback.xml" />
  </then>
  <else>
    <include resource="config/${env:-local}/logback.xml" />
  </else>
</if>

加上pom.xml

<dependency>
  <groupId>org.codehaus.janino</groupId>
  <artifactId>janino</artifactId>
</dependency>

不是很好吗?!那么他们为什么要打破那些工作得很好的呢?

答案 1 :(得分:0)

这对我有用:

<property name="extra" value="${logback.myApp.extra:- }" />

Logback 似乎从值中删除了空白。所以 Space 的默认值起到了作用。

Embedded 保留空白,如果嵌入了制表符,则可能会导致 FileNotFoundException,但嵌入的空格没问题。

在 Java Initialiser 中设置属性达到了预期的效果:

System.setProperty("logback.myApp.extra", "\t    \tEXTRA_EXTRA_EXTRA\t    \t");

TabsSpaces 已从属性中删除,并为其分配了值 EXTRA_EXTRA_EXTRA

(必须在发生任何日志记录之前调用 Java 初始化程序并且可以不包含日志本身)
您当然可以在 Java 命令行上设置属性。

附言如果属性未定义并且您省略了空格 (${logback.myApp.extra:-}),则会为其分配值:

logback.myApp.extra_IS_UNDEFINED

...所以添加合适的评论可能是明智的:

<property name="extra" value="${logback.myApp.extra:- }" /><!-- N.B. Empty Default value must contain @ least 1 Space!! -->