我们关于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
所在的空字符串。
答案 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");
Tabs
和 Spaces
已从属性中删除,并为其分配了值 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!! -->