如何在Hibernate 2.1.6中屏蔽日志里的用户名与密码?
解决Hibernate 2.1.6日志打印敏感连接信息的方案
因为你无法升级Hibernate或更换日志框架,以下是几个可行的方案:
方案1:调整底层日志框架的级别(推荐)
commons-logging 1.0.4默认桥接JDK自带的java.util.logging(JUL),你可以通过配置JUL的日志级别,屏蔽Hibernate的DEBUG/INFO级别的敏感输出:
- 新建
logging.properties文件,内容如下:
# 全局基础日志级别 .level=INFO # 将Hibernate核心包日志级别设为WARN,避免打印连接属性等敏感细节 org.hibernate.level=WARNING # 配置控制台输出(按需保留) handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=INFO
- 启动Jar包时指定该配置文件:
java -Djava.util.logging.config.file=./logging.properties -jar your-application.jar
设置后Hibernate只会输出WARN及以上级别的日志,不会打印包含用户名、密码的连接属性细节。
方案2:自定义Hibernate Configuration类(进阶)
如果调整日志级别不可行,可以通过继承Hibernate的Configuration类,覆盖会打印敏感信息的方法:
- 创建自定义Configuration子类:
import org.hibernate.cfg.Configuration; public class SecureConfiguration extends Configuration { @Override protected void logConfiguration() { // 重写日志输出方法,仅保留必要的安全日志,跳过连接属性打印 getLogger().info("Hibernate Configuration loaded successfully"); // 可按需添加其他非敏感的配置日志内容 } }
- 在代码中使用自定义类替代原生Configuration:
Configuration cfg = new SecureConfiguration(); cfg.configure(); SessionFactory sessionFactory = cfg.buildSessionFactory();
注意:需要熟悉Hibernate 2.1.6的源码逻辑,确保重写方法不会影响核心功能。
方案3:添加日志敏感内容过滤器(兜底)
如果上述方法都无法实现,可以在日志输出环节添加过滤器,屏蔽包含敏感关键词的日志行:
- 实现JUL自定义过滤器:
import java.util.logging.Filter; import java.util.logging.LogRecord; public class SensitiveLogFilter implements Filter { private static final String[] SENSITIVE_KEYWORDS = {"password", "username", "jdbc:.*@"}; @Override public boolean isLoggable(LogRecord record) { String msg = record.getMessage(); if (msg == null) return true; for (String keyword : SENSITIVE_KEYWORDS) { if (msg.toLowerCase().contains(keyword)) { return false; } } return true; } }
- 在
logging.properties中配置该过滤器:
java.util.logging.ConsoleHandler.filter=com.yourpackage.SensitiveLogFilter
内容的提问来源于stack exchange,提问作者seema meghasai
相关产品推荐
相关产品推荐

