如何在 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]]

如何让 Squeryl 与 Play 一起工作!框架?

Anorm:隐式转换 [all value(include null)] 到 [String]

In Play 2.4.0 如何在嵌套表单的多字段约束中命名字段?

播放框架2.1 Neo4j内嵌

无法使用 play-slick 1.0.1/slick 3.0 连接到 mysql 数据库:配置错误