在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
语句,就可以了
答案 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脚本的提示如下:
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。