【问题标题】:Play 2.4 - Display Ebeans SQL statement in logsPlay 2.4 - 在日志中显示 Ebeans SQL 语句
【发布时间】:2015-08-29 22:51:01
【问题描述】:

如何在日志中显示 SQL 语句?我正在使用 EBeans,但由于某些原因无法插入,但我看不出有什么问题。

我尝试将我的配置编辑为:

db.default.logStatements=true

并将其添加到 logback.xml

<logger name="com.jolbox" level="DEBUG" />

按照我在网上找到的一些答案,但它似乎不适用于 2.4...

【问题讨论】:

    标签: sql logging playframework ebean playframework-2.4


    【解决方案1】:

    Play 2.4 更改了日志记录。从现在开始,要在控制台中显示 SQL 语句,只需在 conf/logback.xml 文件中添加以下行:

    <logger name="org.avaje.ebean.SQL" level="TRACE" />
    

    它应该可以正常工作。

    正如@Flo354 在 cmets 中指出的那样,您应该使用 Play 2.6

    <logger name="io.bean" level="TRACE" />
    

    【讨论】:

    • 可以在代码中实现吗?仅在 Play.isDev() 时激活!
    • 为避免在生产环境中记录 SQL 语句,您可以使用两个不同的文件:一个用于开发的默认文件 (logback.xml),另一个用于生产环境 (logback-production.xml)。然后,要使用生产版本,请添加 -Dlogger.resource=conf/logback-production.xml。
    • 问题适用于 Play 2.4,但从 Play 2.6 开始,org.avaje.ebean 现在是 io.ebean
    【解决方案2】:

    从 Play 2.5 开始记录 SQL 语句非常简单,Play 2.5 有一个简单的方法来记录 SQL 语句,建立在 jdbcdslog 之上,适用于所有 JDBC 数据库、连接池实现和持久性框架(Anorm、Ebean、JPA、光滑等)。启用日志记录后,您将看到发送到数据库的每条 SQL 语句以及有关语句运行时间的性能信息。

    Play 2.5 中的 SQL 日志语句功能可以通过数据库配置,使用 logSql 属性:

    db.default.logSql=true
    

    之后,您可以通过将这行添加到logback.xml来配置jdbcdslog-exp日志级别:

      <logger name="org.jdbcdslog.ConnectionLogger" level="OFF"  /> <!-- Won' log connections -->
      <logger name="org.jdbcdslog.StatementLogger"  level="INFO" /> <!-- Will log all statements -->
      <logger name="org.jdbcdslog.ResultSetLogger"  level="OFF"  /> <!-- Won' log result sets -->
    

    【讨论】:

      【解决方案3】:

      仅供参考,在 Ebean 的 new doc page 上有很好的视频教程,展示了仅为代码的选定区域捕获 SQL 语句的方法。

      因此,您可以在开发时仅在有问题的地方记录语句,和/或使用记录的语句以 showed in video 执行测试。

      简而言之:像往常一样将最新的 avaje-ebeanorm-mocker 依赖项添加到您的 built.sbt 中,以便稍后您可以在代码中使用它,例如:

      LoggedSql.start();
      User user = User.find.byId(123);
      // ... other queries
      List<String> capturedLogs = LoggedSql.stop();
      

      请注意,如果您不需要处理它们,您甚至不需要获取语句的List,因为它们通常显示在控制台中。所以你也可以这样使用它:

      if (Play.isDev()) LoggedSql.start();
      User user = User.find.byId(345);
      // ... other queries
      if (Play.isDev()) LoggedSql.stop();
      

      【讨论】:

      • 这对我不起作用。玩 2.4.2 和 "com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0", "org.avaje.ebeanorm" % "avaje-ebeanorm-mocker" % "6.15.1" 我是得到空集。我错过了什么明显的东西吗?
      【解决方案4】:

      我成功使用了jdbcdslog。正如@Saeed Zarinfam 提到的here,Play 2.5 默认包含这个。

      this answer 不同,此解决方案显示参数值而不是问号。

      以下是我为使其适用于 Play 2.4 和 MySQL 所遵循的步骤:

      添加到 build.sbt:

      "com.googlecode.usc" % "jdbcdslog" % "1.0.6.2"
      

      添加到 logback.xml:

      <logger name="org.jdbcdslog.StatementLogger"  level="INFO" /> <!-- Will log all statements -->
      

      创建 conf/jdbcdslog.properties 文件,其中包含:

      jdbcdslog.driverName=mysql
      jdbcdslog.showTime=true
      

      更改 db.default.url(示例):

      jdbc:mysql://127.0.0.1:3306/mydb
      

      更改为 jdbc:jdbcdslog:mysql://127.0.0.1:3306/mydb;targetDriver=com.mysql.jdbc.Driver

      更改 db.default.driver:

      org.jdbcdslog.DriverLoggingProxy
      

      【讨论】:

        猜你喜欢
        • 2012-11-04
        • 1970-01-01
        • 2014-04-02
        • 2017-11-19
        • 2020-02-19
        • 1970-01-01
        • 2015-04-10
        • 2015-08-29
        • 2015-09-09
        相关资源
        最近更新 更多