You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过log4j2.xml控制Rest Assured日志?两类实现疑问

RestAssured 5.3.0 日志重定向至Log4j2的问题解答

问题背景

希望将RestAssured 5.3.0的日志重定向至Log4j2,并通过log4j2.xml配置文件管控日志。以下是相关代码、配置及日志输出:

应用代码

package org.example;

import io.restassured.RestAssured;
import io.restassured.filter.log.RequestLoggingFilter;
import io.restassured.filter.log.ResponseLoggingFilter;
import org.apache.logging.log4j.io.IoBuilder;

public class App {

    static {
        var logStream = IoBuilder.forLogger(RestAssured.class).buildPrintStream();

        var requestFilter = new RequestLoggingFilter(logStream);
        var responseFilter = new ResponseLoggingFilter(logStream);

        RestAssured.filters(requestFilter, responseFilter);
    }

    public static void main(String[] args) {
        RestAssured.given().get("https://httpbin.org/");
    }
}

Log4j2配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" strict="true">

    <Appenders>
        <Appender type="Console" name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{3} - %msg%n"/>
        </Appender>
    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>

        <Logger name="io.restassured" level="OFF"/>

    </Loggers>

</Configuration>

实际日志输出

13:25:43.198 [main] OFF   io.restassured.RestAssured - Request method:  GET
13:25:43.200 [main] OFF   io.restassured.RestAssured - Request URI: https://httpbin.org/
13:25:43.200 [main] OFF   io.restassured.RestAssured - Proxy:           <none>
13:25:43.200 [main] OFF   io.restassured.RestAssured - Request params:  <none>

问题解答

1. 该日志重定向方法是否正确?

这个方法可行,但存在优化空间:

  • 原理是通过Log4j2的IoBuilder将PrintStream绑定到指定Logger,RestAssured的日志会写入这个流,最终转换为Log4j2的日志事件。
  • 优化建议:明确指定日志级别,避免默认级别带来的管控问题。比如将构建流的代码改为:
    var logStream = IoBuilder.forLogger(RestAssured.class)
                            .setLevel(org.apache.logging.log4j.Level.INFO)
                            .buildPrintStream();
    
    这样日志事件会以INFO级别输出,更符合常规日志管控逻辑。

2. 为何设置io.restassured日志级别为OFF后日志仍会显示?

核心原因有两点:

  • 当前使用IoBuilder构建的PrintStream默认输出OFF级别的日志事件(未显式指定级别时的默认行为)。
  • Log4j2的级别过滤规则:当Logger级别设为OFF时,仅OFF级别的事件会被该Logger处理;同时由于该Logger的additivity属性默认是true,处理后的事件会传递给父Logger(此处为Root)。Root的级别是DEBUG,OFF级别高于DEBUG,所以事件会被Root的Console Appender输出。

解决方法

任选其一即可:

  • 方法一:指定日志级别:修改代码,给IoBuilder设置具体的日志级别(如INFO/DEBUG),这样当io.restassured的级别设为OFF时,低于OFF级别的事件会被直接过滤。
  • 方法二:修改Log4j2配置:给io.restassured的Logger添加additivity="false",切断事件向父Logger的传递,配置如下:
    <Logger name="io.restassured" level="OFF" additivity="false"/>
    

内容的提问来源于stack exchange,提问作者Georgi Georgiev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:57:43