【问题标题】:logback condition not working回退条件不起作用
【发布时间】:2017-11-16 18:32:27
【问题描述】:

我正在尝试定义一个 logback.xml,它在 PROD 环境中将 loglevel 设置为 INFO,将所有其他环境设置为 DEBUG。 因此,我们有一个环境变量 ENV,它在 PROD 环境中设置为“PROD”。 我的 logback.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{"yyyy-MM-dd'T'HH:mm:ss.SSSZ"} [%thread] %-5level %logger %mdc - %msg%n</pattern>
    </encoder>
</appender>

<appender name="aiAppender" class="com.microsoft.applicationinsights.logback.ApplicationInsightsAppender" />

<!-- Choose INFO level on PROD, DEBUG on other environments -->
<property name="logLevel" value="DEBUG" />
<if condition='property("ENV").contains("PROD")'>
    <then>
        <property name="logLevel" value="INFO" />
    </then>
</if>

<root level="${logLevel}">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="aiAppender" />
</root>
</configuration>

如果 ENV 设置为 PROD,则应将属性“logLevel”设置为 INFO。不幸的是,这不起作用 - 无论我是在环境级别(windows:SET ENV=PROD)还是在 java vm 级别使用 -D 设置属性。

知道我做错了什么吗?

更新:我发现根据文档,janino 库必须在类路径中。添加一个并查看日志也证明这似乎是问题所在:

09:50:06,127 |-ERROR in ch.qos.logback.core.joran.conditional.IfAction - Could not find Janino library on the class path. Skipping conditional processing.

不幸的是,即使我将它添加到我的 gradle 依赖项中,此消息仍然会出现。这是我的 build.gradle:

apply plugin: 'java-library'
apply plugin: 'maven'

sourceCompatibility = 1.8

dependencies {
    // https://mvnrepository.com/artifact/javax/javaee-api
    compileOnly group: 'javax', name: 'javaee-api', version: '7.0'

    api group: 'com.microsoft.azure', name: 'applicationinsights-core', version: '1.0.7'
    api group: 'com.microsoft.azure', name: 'applicationinsights-web', version: '1.0.7'
    api group: 'com.microsoft.azure', name: 'applicationinsights-logging-logback', version: '1.0.7'
    api group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    api group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
    api group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'

    api group: 'org.codehaus.janino', name: 'janino', version: '3.0.6'
    api group: 'org.codehaus.janino', name: 'commons-compiler', version: '3.0.6'


    testImplementation group: 'junit', name: 'junit', version: '4.11'
    testImplementation "org.mockito:mockito-core:2.+"
}

知道为什么在类路径中仍未找到 janino 吗?

【问题讨论】:

  • 您可以尝试将其构造为if - then-else 吗?如果 PROD 则 loglevel = PROD,否则 loglevel = DEBUG 。
  • 这是我的第一次尝试 - 也没有用。
  • 我正处于研究类似问题的早期阶段,当我们从 logback 1.1.10 更新到 1.2.3 时似乎已经出现了。您使用的是哪个版本? (你找到解决问题的方法了吗?)

标签: java gradle logback logback-classic


【解决方案1】:

如果你有 logback 版本 1.2.3,你需要 janino 版本 3.1.2。此外,对我来说,compile 还不够。

implementation group: 'org.codehaus.janino', name: 'janino', version: '3.1.2'

旁注:commons-compiler 并不是真正需要的条件。

【讨论】: