hibernate - 将 Hibernate SELECT 语句记录到它们自己的日志文件中
问题描述
在我们的 Grails 2.4.4 应用程序上线之前,我们将在接下来的两周内完成完整的 UAT。我想记录SELECT
Hibernate4 生成的所有将在那时执行的语句,以便我可以开发适当优化的数据库索引。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
语句就可以了
解决方案
我无法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如下:
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
GrailsConfig.groovy
或 Tomcat 提供正确的配置方法,将不胜感激。
推荐阅读
- python - 为什么这段python代码在输入某个整数后停止工作?
- nlp - 如何微调 BERT Base(未封装模型)以生成嵌入?
- flutter - Android Plugin 4.2.0 版本与 Flutter 集成测试不兼容
- java - 如何在 Jruby 的类路径中添加/加载 java jar
- android - 使用 PdfRenderer 在 Jetpack Compose 中创建 PDF 查看器
- c# - 如何在 Unity 的新输入系统中记录按下的键(键字符 - 小写/大写)
- gitlab - 如何将问题添加到特定的 Git 分支而不是主分支
- clickhouse - ClickHouse:如何计算累积 sumMap 'clickhouse' 方式?
- matlab - 带三叶草校正的威尔逊狄拉克算子的有限差分法
- spring-boot - Spring Boot Rest API - 部署在 Wildfly SErver