将 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脚本的分解如下:
cat catalina.out
获取源文件。
grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL"
仅过滤以昨天的日期开始的行(您通过这部分:$(date -d "yesterday 13:00" '+%Y-%m-%d')
)并且在字符串之间某处有字符串 DEBUG hibernate.SQL
。
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
. 开头
sort
按字母顺序对行进行排序 (可选).
uniq
删除重复行 (可选).
sed 's/$/;\n/'
在每行末尾添加一个分号和一个新行。
> "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log"
将输出保存到新文件 hibernate.YYYY-MM-dd.log
.
如果不是紧急情况,我宁愿不使用这个 "hacky" 解决方案,毕竟我们需要在明天之前找到解决方案。如果有人仍然可以通过 log4j
、Grails Config.groovy
或 Tomcat 提供正确的配置方法,将不胜感激。
在我们的 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脚本的分解如下:
cat catalina.out
获取源文件。grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL"
仅过滤以昨天的日期开始的行(您通过这部分:$(date -d "yesterday 13:00" '+%Y-%m-%d')
)并且在字符串之间某处有字符串DEBUG hibernate.SQL
。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
. 开头
sort
按字母顺序对行进行排序 (可选).uniq
删除重复行 (可选).sed 's/$/;\n/'
在每行末尾添加一个分号和一个新行。> "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log"
将输出保存到新文件hibernate.YYYY-MM-dd.log
.
如果不是紧急情况,我宁愿不使用这个 "hacky" 解决方案,毕竟我们需要在明天之前找到解决方案。如果有人仍然可以通过 log4j
、Grails Config.groovy
或 Tomcat 提供正确的配置方法,将不胜感激。