如何禁用Quarkus应用中AWS SDK Java 2.x DEBUG级敏感日志?
解决Quarkus应用S3上传时DEBUG日志泄露敏感信息的问题
问题根源
从你的日志示例可以看到,敏感信息是由io.netty.handler.logging.LoggingHandler(日志中缩写为io.ne.ha.lo.LoggingHandler)打印的,而非你之前针对的AWS SDK相关类,所以之前的过滤规则完全没命中目标日志。
有效解决方案
方案1:直接降低Netty日志级别(最简单)
直接将io.netty.handler.logging.LoggingHandler的日志级别从DEBUG调整为INFO或更高,彻底禁止它打印DEBUG级别的请求细节。
方式A:使用Quarkus配置文件(application.properties)
quarkus.log.category."io.netty.handler.logging.LoggingHandler".level=INFO
方式B:使用Log4j2配置文件(log4j2.xml)
<Loggers> <Logger name="io.netty.handler.logging.LoggingHandler" level="INFO" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 保留你的其他Logger配置 --> </Loggers>
方案2:掩码敏感内容(保留Netty DEBUG日志但隐藏敏感信息)
如果需要保留Netty的DEBUG日志,仅屏蔽敏感字段,需要修正你的自定义日志转换器并正确注册:
- 修正自定义转换器的匹配规则
替换之前的匹配逻辑,直接针对日志中的敏感字段做掩码:
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.pattern.ConverterKeys; import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; import org.apache.logging.log4j.core.pattern.PatternConverter; import java.util.regex.Matcher; import java.util.regex.Pattern; @Plugin(name = "LogMaskingConverter", category = PatternConverter.CATEGORY) @ConverterKeys({"maskLogs"}) public class LogMaskingConverter extends LogEventPatternConverter { // 匹配敏感字段的正则 private static final Pattern SENSITIVE_PATTERNS = Pattern.compile( "(Authorization: AWS4-HMAC-SHA256 Credential=)[^,]+|" + "(x-amz-security-token:)[^,]+|" + "(PUT /)[^/]+/([^ ]+)", Pattern.CASE_INSENSITIVE ); protected LogMaskingConverter(String name) { super(name, null); } public static LogMaskingConverter newInstance(final String[] options) { return new LogMaskingConverter("maskLogs"); } @Override public void format(LogEvent event, StringBuilder outputMessage) { String message = event.getMessage().getFormattedMessage(); Matcher matcher = SENSITIVE_PATTERNS.matcher(message); String maskedMessage = matcher.replaceAll(matchResult -> { if (matchResult.group(1) != null) { return matchResult.group(1) + "[MASKED]"; } else if (matchResult.group(2) != null) { return matchResult.group(2) + " [MASKED]"; } else if (matchResult.group(3) != null) { return matchResult.group(3) + "[MASKED]/[MASKED_FILE_NAME]"; } return matchResult.group(); }); outputMessage.append(maskedMessage); } }
- 在Log4j2中注册并使用转换器
修改log4j2.xml的PatternLayout,指定使用自定义转换器:
<Configuration> <Converters> <Converter name="maskLogs" class="com.your.package.LogMaskingConverter"/> </Converters> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p [%c{2.}] (%t) %maskLogs{%m}%n"/> </Console> </Appenders> <Loggers> <!-- 确保Netty的LoggingHandler级别还是DEBUG --> <Logger name="io.netty.handler.logging.LoggingHandler" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="DEBUG"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
方案3:限制AWS SDK日志级别
额外确保AWS SDK本身不会打印敏感日志,添加配置:
# application.properties quarkus.log.category."software.amazon.awssdk".level=INFO
为什么之前的方法没用?
你之前的过滤规则都是针对AWS SDK的类名,但实际打印敏感信息的是Netty的LoggingHandler,这些规则根本没匹配到目标日志;自定义转换器也因为没有正确注册到Log4j2的PatternLayout中,所以没有生效。
内容的提问来源于stack exchange,提问作者Bogan
相关产品推荐
相关产品推荐

