【问题标题】:How to enable trace/debugging output with Anorm on Play 2.4.0如何在 Play 2.4.0 上使用 Anorm 启用跟踪/调试输出
【发布时间】: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):stackoverflow.com/a/31931578/56285。我还没有找到适用于 HikariCP 的解决方案。

标签: logback anorm playframework-2.4


【解决方案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/

让我知道这是否适合你

【讨论】:

【解决方案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)
猜你喜欢
  • 1970-01-01
  • 2014-10-24
  • 2017-01-19
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多