将Hibernate SELECT语句记录到自己的日志文件中

时间:2019-03-21 13:07:19

标签: hibernate grails log4j

在Grails 2.4.4应用程序上线之前,我们将在接下来的两周内获得完整的UAT。我想记录Hibernate4生成的所有SELECT语句,这些语句将在那时执行,以便开发适当优化的数据库索引。 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语句,就可以了

2 个答案:

答案 0 :(得分:0)

我不再有grails 2应用程序对此进行测试,但是我相信您可以像这样配置命名追加程序:

log4j = { root ->
  appenders {
    rollingFile name: "sqlLog", file: "target/sql.log" as String
  }
}

,然后将特定的日志记录指向命名的附加程序,如下所示:

 debug sqlLog: 'org.hibernate.SQL', 'org.codehaus.groovy.grails.orm.hibernate.cfg'

答案 1 :(得分:0)

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

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

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脚本的提示如下:

  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 -的第一部分。我们的行应立即以SELECTUPDATEDELETE开头。
  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”解决方案,毕竟我们明天需要一个解决方案。如果有人仍然可以提供通过log4j进行配置的正确方法,那么将非常感谢Grails Config.groovy或Tomcat。