首页 > 解决方案 > 将 Hibernate SELECT 语句记录到它们自己的日志文件中

问题描述

在我们的 Grails 2.4.4 应用程序上线之前,我们将在接下来的两周内完成完整的 UAT。我想记录SELECTHibernate4 生成的所有将在那时执行的语句,以便我可以开发适当优化的数据库索引。Grails 或 Tomcat 中是否有将SELECT语句记录到.log每天分发的文件中的配置,类似于catalina.YYYY-MM-dd.log?我已配置log4j通过以下方式记录查询Config.groovy

log4j.main = {
    ...
    debug 'org.hibernate.SQL', 'org.codehaus.groovy.grails.orm.hibernate.cfg'
    ...
}

它登录catalina.out。我可以对其进行配置,以便将其附加到不同的日志文件中,比如说hibernate.YYYY-MM-dd.log?我不介意参数是否会被替换?,只要我能得到SELECT语句就可以了

标签: hibernategrailslog4j

解决方案


我无法hibernate.SQL通过@Daniel 的回答将其配置为为日志创建单独的文件。但由于我的团队需要从明天开始记录查询,所以我决定手动从中提取所需的日志catalina.out

首先,SQL在创建战争之前启用 Grails 应用程序的语句记录

log4j.main = {
    ...
    debug 'org.hibernate.SQL'
    ...
}

应用程序会将所有SQL语句记录到catalina.out中,顺便说一下,这会导致文件变得不必要地大。现在我们需要在每天开始时安排一个 cron 任务来提取前一天的语句并将它们编译成一个单独的每日文件。

cat catalina.out | grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL" | cut -d " " -f 8- | sort | uniq | sed 's/$/;\n/' > "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log"

bash脚本的beakdown如下:

  1. cat catalina.out获取源文件。
  2. grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL"仅过滤以昨天日期开头的行(您通过这部分:$(date -d "yesterday 13:00" '+%Y-%m-%d'))并且在字符串DEBUG hibernate.SQL之间的某处有字符串。
  3. cut -d " " -f 8-删除该行的第一部分YYYY-MM-dd HH:mm:ss,xxx [http-bio-xxx.xxx.xxx.xxx-xx-exec-x] DEBUG hibernate.SQL -。我们的行应该立即以SELECT,UPDATE或开头DELETE
  4. sort按字母顺序对行进行排序(可选)
  5. uniq删除重复行(可选)
  6. sed 's/$/;\n/'在每行的末尾附加一个分号和一个新行。
  7. > "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log"将输出保存到新文件hibernate.YYYY-MM-dd.log

如果不是紧急情况,我宁愿不使用这种“hacky”解决方案,毕竟我们明天需要一个解决方案。如果有人仍然可以通过log4jGrailsConfig.groovy或 Tomcat 提供正确的配置方法,将不胜感激。


推荐阅读