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

如何禁用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日志,仅屏蔽敏感字段,需要修正你的自定义日志转换器并正确注册:

  1. 修正自定义转换器的匹配规则
    替换之前的匹配逻辑,直接针对日志中的敏感字段做掩码:
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:08:10