如何在Play 2.4.0上使用Anorm启用跟踪/调试输出

4
在Play 2.4.0中,Anorm被移动到了一个外部包,并且日志记录被更改为LogBack (http://logback.qos.ch)。虽然这很好,但是没有任何类/包名称可以用于跟踪SQL调用。
“明显的”(基于导入语句): <logger name="anorm" level="TRACE" /> 没有任何作用,我还尝试了 <logger name="anorm.SQL" level="TRACE" /> 只是为了更加具体。谷歌搜索也没有帮助,所以我不知所措。
有人能提供帮助吗?

是的,我尝试将整个应用程序置于跟踪模式,以查看是否可以从日志输出中获取类名,但仍然没有SQL调用。 - Techmag
有一种方法涉及将连接池从新的默认HikariCP更改回BoneCP:https://dev59.com/questions/zWox5IYBdhLWcg3wLhei#31931578。我还没有找到适用于HikariCP的解决方案。 - Jonik
2个回答

4
您可以使用log4jdbc拦截通过JDBC驱动程序进行的调用。我已经在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 文件(在 classpath 上的 conf 目录中创建):

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

更多文档请查看:https://code.google.com/p/log4jdbc-log4j2/

如果这个对你有用,请告诉我。


看起来完美 - 我会检查一下 - 谢谢! - Techmag
1
PS:代码已经迁移到GitHub上了:https://github.com/arthurblake/log4jdbc(为以后Google Code停用做好准备)。 - Techmag
说句题外话,当我为Postgres配置它时,我需要使用“log4jdbc-log4j2-jdbc4”的版本“1.16”。 版本1.12存在错误,导致ResultSet过早关闭。 https://code.google.com/archive/p/log4jdbc-log4j2/issues/4 - RJ Regenold

1
Anorm不记录任何内容(也不使用logback),但'output'是纯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 上获取。

那是否意味着你必须复制这些语句?附注:我通过修改我的库以根据需要跟踪任何调用来解决了我的问题。虽然不是最佳选择,但已经满足要求。考虑到norm很可能会被更具语言特色的SQL解决方案所取代,我猜想norm现在只会慢慢消亡... - Techmag
啊 - 我看到可以传递一个引用到初始语句,而不必重复它(呼) - Techmag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接