我的EvaluatorFilter在Spring Boot + logback-access.xml中不起作用

时间:2017-06-22 22:21:43

标签: java spring-boot logback

我设法将logback-access.xml与Tomcat项目上的Spring Boot集成在一起,但就我而言,我无法尊重我的ch.qos.logback.core.filter.EvaluatorFilter。它肯定会看到并使用我的logback-access.xml文件(如果我更改了编辑器.pattern,输出消息会改变),但似乎忘记了我在那里配置的过滤器;我没有得到我正在寻找的效果,这是从/ healthz网址抑制任何访问日志消息,我没有看到我的System.out.println求助

logback-access.xml文件看起来像

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>
                    System.out.println("ROBERT!!!! " + formattedMessage);
                    return formattedMessage.contains("/healthz");
                </expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <encoder>
            <pattern>%h %l %u %user %date "%r" %s %b</pattern>
        </encoder>
    </appender>
    <appender-ref ref="CONSOLE"/>
</configuration>

build.gradle具有必需的依赖项

    compile(group: 'net.rakugakibox.springbootext', name: 'spring-boot-ext-logback-access', version: '1.6')
    compile group: 'org.codehaus.janino', name: 'janino', version: '3.0.7'

日志输出嘲笑我......

0:0:0:0:0:0:0:1 - - - 22/Jun/2017:15:16:17 -0700 "GET /healthz HTTP/1.1" 200 27
0:0:0:0:0:0:0:1 - - - 22/Jun/2017:15:18:18 -0700 "GET /v1/scouting_activities/fcdc7aae-4f11-4476-bb81-6d5e3f52e1b4 HTTP/1.1" 200 1939

如何在Spring Boot 1.4.1下的logback-access.xml中获取ch.qos.logback.core.filter.EvaluatorFilter来工作并跳过GET / healthz请求?

1 个答案:

答案 0 :(得分:2)

如果您调试回溯配置,您将看到问题(<configuration debug="true">)。

11:03:53,559 |-ERROR in ch.qos.logback.access.boolex.JaninoEventEvaluator@649725e3 - Could not start evaluator with expression [System.out.println("ROBERT!!!! " + formattedMessage);
                    return false;] org.codehaus.commons.compiler.CompileException: Line 1, Column 52: Expression "formattedMessage" is not an rvalue
    at org.codehaus.commons.compiler.CompileException: Line 1, Column 52: Expression "formattedMessage" is not an rvalue

问题是,logback-access不能在ILoggingEvent上运行,而是在IAccessEvent上运行。

每种类型的活动都有JaninoEventEvaluator个班级 logback-access评估程序没有formattedMessage值。

但它具有event值,它是IAccessEvent的实例。

所以,只需将表达式更改为以下内容即可。

<expression>
    System.out.println("ROBERT!!!! " + event.getRequestURI());
    return event.getRequestURI().contains("/healthz");
</expression>