如何通过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的日志事件。 - 优化建议:明确指定日志级别,避免默认级别带来的管控问题。比如将构建流的代码改为:
这样日志事件会以INFO级别输出,更符合常规日志管控逻辑。var logStream = IoBuilder.forLogger(RestAssured.class) .setLevel(org.apache.logging.log4j.Level.INFO) .buildPrintStream();
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
相关产品推荐
相关产品推荐

