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

Logging Hibernate SELECT statements into their own log files

在我们的 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语句

就可以了

我不再有 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'

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

首先,在创建 war

之前启用 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. 开头
  5. sort 按字母顺序对行进行排序 (可选).
  6. uniq 删除重复行 (可选).
  7. sed 's/$/;\n/' 在每行末尾添加一个分号和一个新行。
  8. > "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log" 将输出保存到新文件 hibernate.YYYY-MM-dd.log.

如果不是紧急情况,我宁愿不使用这个 "hacky" 解决方案,毕竟我们需要在明天之前找到解决方案。如果有人仍然可以通过 log4j、Grails Config.groovy 或 Tomcat 提供正确的配置方法,将不胜感激。