如何在Kotlin+Exposed项目中配置PostgreSQL驱动输出SQL日志
解决PostgreSQL JDBC + Exposed 控制台输出所有SQL的问题
代码配置Java Util Logging(无需外部配置文件)
PostgreSQL JDBC驱动通过org.postgresql命名空间的FINE级别日志输出所有执行的SQL,包括正常执行语句。以下代码可直接在应用启动时配置:
import java.util.logging.* fun setupPgSqlDebugLogging() { // 定位PostgreSQL驱动的日志根节点 val pgLogger = Logger.getLogger("org.postgresql") // 禁用父日志处理器的继承,防止重复输出 pgLogger.useParentHandlers = false // 开启FINE级别日志,这是驱动输出SQL的最低级别 pgLogger.level = Level.FINE // 创建控制台输出处理器 val consoleHandler = ConsoleHandler().apply { level = Level.FINE // 使用简洁格式,便于调试查看 formatter = object : SimpleFormatter() { override fun format(record: LogRecord): String { return "[PG-SQL] ${record.message}\n" } } } pgLogger.addHandler(consoleHandler) }
配合Exposed框架的SQL日志(可选)
如果需要同时查看Exposed生成SQL的过程,可启用Exposed自带的控制台日志:
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.StdOutSqlLogger import org.jetbrains.exposed.sql.addLogger // 初始化数据库连接 Database.connect( url = "jdbc:postgresql://localhost:5432/your_database", driver = "org.postgresql.Driver", user = "your_user", password = "your_password" ) // 在事务中添加日志处理器(可全局配置或单事务配置) transaction { addLogger(StdOutSqlLogger) // 执行你的数据库操作,比如: // User.selectAll().forEach { println(it[User.name]) } }
关键说明
- 仅需在应用启动时调用
setupPgSqlDebugLogging()一次即可生效 - 调试完成后,记得将日志级别改回
Level.INFO或更高,避免生产环境输出冗余日志 - 若项目已有JUL配置,需确保不会覆盖此配置的处理器和级别
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

