Gatling日志优化:排除大响应体避免内存溢出与日志冗余
解决Gatling大响应体日志引发的内存溢出问题
方案1:通过Logback过滤特定请求的TRACE日志
Gatling基于Logback实现日志功能,你可以给io.gatling.http.engine.response日志器配置过滤器,直接跳过匹配JS资源特征的日志:
- 修改项目中的
logback.xml或logback-test.xml文件,添加自定义过滤规则:
<configuration> <!-- 保留原有日志appender配置 --> <logger name="io.gatling.http.engine.response" level="TRACE"> <appender-ref ref="YOUR_APPENDER_NAME"/> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <!-- 替换成你的JS资源路径特征,比如匹配.js后缀或特定静态资源路径 --> <expression>message.contains(".js") || message.contains("/static/js/")</expression> </evaluator> <onMismatch>ACCEPT</onMismatch> <onMatch>DENY</onMatch> </filter> </logger> </configuration>
方案2:限制响应体日志的输出长度
通过自定义Logback格式化转换器,截断过长的响应体内容,避免大文本占用内存:
- 实现一个Java自定义转换器类:
import ch.qos.logback.core.pattern.CompositeConverter; import ch.qos.logback.classic.spi.ILoggingEvent; public class TruncateBodyConverter extends CompositeConverter<ILoggingEvent> { private static final int DEFAULT_MAX_LENGTH = 100; private int maxLength = DEFAULT_MAX_LENGTH; @Override public void start() { String maxLengthStr = getFirstOption(); if (maxLengthStr != null) { try { maxLength = Integer.parseInt(maxLengthStr); } catch (NumberFormatException e) { addError("无效的最大长度值: " + maxLengthStr, e); } } super.start(); } @Override protected String transform(ILoggingEvent event, String body) { if (body == null || body.length() <= maxLength) { return body; } return body.substring(0, maxLength) + "... [已截断]"; } }
- 在
logback.xml中注册并使用该转换器:
<configuration> <!-- 注册自定义转换器 --> <conversionRule conversionWord="truncateBody" converterClass="com.yourpackage.TruncateBodyConverter"/> <!-- 修改日志格式,将响应体输出替换为截断后的内容 --> <appender name="YOUR_APPENDER_NAME" class="ch.qos.logback.core.FileAppender"> <file>gatling.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %truncateBody{100}%n</pattern> </encoder> </appender> <logger name="io.gatling.http.engine.response" level="TRACE" additivity="false"> <appender-ref ref="YOUR_APPENDER_NAME"/> </logger> </configuration>
%truncateBody{100}表示只保留响应体前100字节,超出部分会添加截断标记。
方案3:结合Gatling请求标记过滤
在Gatling脚本中给需要追踪的请求打标记,再通过Logback只记录带标记的请求日志:
- 脚本中给关键请求添加自定义标记:
http("核心业务接口") .get("/api/核心接口路径") .tag("need-trace")
- 修改Logback配置,仅保留包含该标记的日志:
<logger name="io.gatling.http.engine.response" level="TRACE"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>message.contains("tag=need-trace")</expression> </evaluator> <onMismatch>DENY</onMismatch> <onMatch>ACCEPT</onMatch> </filter> </logger>
内容的提问来源于stack exchange,提问作者Kirous
相关产品推荐
相关产品推荐

