如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出
Posted
技术标签:
【中文标题】如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出【英文标题】:How to enable trace/debugging output with Anorm on Play 2.4.0 【发布时间】:2015-06-04 14:46:26 【问题描述】:在 Play 2.4.0 中,Anorm 移至外部包,日志记录更改为 LogBack (http://logback.qos.ch)
一切都很好,但是对于跟踪 SQL 调用来说,类/包名称在任何地方都不明显。
“显而易见”(基于导入语句)
<logger name="anorm" level="TRACE" />
什么也没做,我也试过了
<logger name="anorm.SQL" level="TRACE" />
以防万一它需要更具体。
Google 搜索非常需要,所以我不知所措。
有人吗?
【问题讨论】:
是的,我尝试将整个应用程序置于跟踪模式,以查看是否可以从日志输出中获取类名,但仍然没有 SQL 调用。 有一种方法可以将连接池更改回 BoneCP(从新的默认 HikariCP):***.com/a/31931578/56285。我还没有找到适用于 HikariCP 的解决方案。 【参考方案1】:您可以使用
拦截通过 JDBC 驱动程序的调用log4jdbc
我已经在 Play 2.4 上成功使用了 JPA/hibernate 和 Hikary,设置应该相同,因为这会影响 JDBC 层。
将库添加到您的 build.sbt:
"org.bgee.log4jdbc-log4j2" % "log4jdbc-log4j2-jdbc4" % "1.12"
调整配置。添加log4jdbc,log4jdbc会自动从字符串中检测底层驱动:mysql。如果您使用的是不起眼的 JDBC 驱动程序,则可以使用配置选项对其进行配置 - 请参阅下面的文档。
db.default.url="jdbc:log4jdbc:mysql://localhost/......"
db.default.driver=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
我的 logback.xml 示例,相关部分:
<logger name="log4jdbc.log4j2" level="ERROR">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
<logger name="jdbc.sqlonly" level="INFO" >
<appender-ref ref="DBFILE" />
</logger>
<appender name="DBFILE" class="ch.qos.logback.core.FileAppender">
<file>$application.home/logs/sql.log</file>
<encoder>
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
最后是 log4jdbc.log4j2.properties(在类路径上的 conf 目录中创建它):
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
更多文档:https://code.google.com/p/log4jdbc-log4j2/
让我知道这是否适合你
【讨论】:
这看起来很完美 - 我会检查一下 - 谢谢! PS:代码已移至 GitHub:github.com/arthurblake/log4jdbc(供将来参考,一旦 google 代码消失) 为了它的价值,在为 Postgres 配置它时,我需要使用“log4jdbc-log4j2-jdbc4”的“1.16”版本。 1.12 版有一个错误导致 ResultSet 过早关闭。 code.google.com/archive/p/log4jdbc-log4j2/issues/4【参考方案2】:Anorm 不记录任何内容(也不使用 logback),但“输出”是纯 JDBC,因此您可以在连接池上配置调试。
编辑:
我的框架 Acolyte 中的 debug utility 可用于打印/记录将通过连接执行的 JDBC 语句。
如果你有SQL"SELECT * FROM Test WHERE id = $id"
,可以如下调试。
<!-- language: scala -->
import acolyte.jdbc.AcolyteDSL
AcolyteDSL.debuging() implicit dcon =>
SQL"SELECT * FROM Test WHERE id = $id"
// just print the prepared statement
// with parameters bound
// really execute,
// the check the real ResultSet
SQL"SELECT * FROM Test WHERE id = $id"
Acolyte 可通过 Maven Central 获得。
【讨论】:
这是否意味着您必须复制这些语句? PS:我通过修改我的库以根据需要跟踪任何调用来解决我的问题。不是最佳的,但符合要求。鉴于规范可能会被逐步淘汰以支持更惯用的 sql 解决方案,我怀疑规范现在只会慢慢消亡...... 啊 - 我看到可以传递对初始 stmt 的引用,而不必复制它(whew)以上是关于如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出的主要内容,如果未能解决你的问题,请参考以下文章
迁移到 anorm2.4(使用 play 2.4):ToStatement[T] 和 ToStatement[Option[T]]
Anorm:隐式转换 [all value(include null)] 到 [String]