如何从日志中移除Spring RestTemplate的client_secret?
解决方案
1. 修复日志级别被覆盖的问题
你推测的没错,org.springframework.web作为父级Logger,其DEBUG级别会通过日志继承性(additivity)传递给子级的RestTemplateLogger,导致你设置的INFO级别不生效。解决方法是给RestTemplate的Logger添加additivity="false",切断与父级Logger的日志传递:
<logger name="org.springframework.web" level="DEBUG"/> <!-- 新增additivity="false",并绑定你使用的Appender --> <logger name="org.springframework.web.client.RestTemplate" level="INFO" additivity="false"> <appender-ref ref="你的Appender名称"/> <!-- 替换为实际的控制台/文件Appender名称 --> </logger>
配置后,RestTemplate只会输出INFO及以上级别的日志,那行包含client_secret的DEBUG日志会被直接屏蔽。
2. 若需保留RestTemplate的其他DEBUG日志(仅屏蔽敏感行)
如果不想完全关闭RestTemplate的DEBUG日志,只想过滤掉包含敏感信息的行,可以给对应的Appender添加日志内容过滤器,用Janino表达式匹配并拒绝特定日志:
<appender name="你的Appender名称" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 添加过滤器,屏蔽RestTemplate中包含client_secret的日志 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>loggerName.equals("org.springframework.web.client.RestTemplate") && message.contains("client_secret")</expression> </evaluator> <onMatch>DENY</onMatch> <!-- 匹配到则拒绝输出 --> <onMismatch>NEUTRAL</onMismatch> <!-- 不匹配则继续后续过滤 --> </filter> </appender>
此时可将RestTemplate的Logger级别改回DEBUG,仅过滤敏感日志行:
<logger name="org.springframework.web" level="DEBUG"/> <logger name="org.springframework.web.client.RestTemplate" level="DEBUG" additivity="false"> <appender-ref ref="你的Appender名称"/> </logger>
内容的提问来源于stack exchange,提问作者Aleksa Majkic
相关产品推荐
相关产品推荐

