有没有办法通过JDBC启用MySQL通用查询记录?我通过搜索找到的最接近的东西是通过JDBC记录慢查询的能力(http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html)。也许我应该这样做并将慢查询阈值设置为0毫秒?
我想以人类可读的格式通过MySQL记录所有查询,并希望指定应该写入日志文件的位置。我知道我会受到性能影响,但我的应用程序只有一个用户并且非常简单,如果性能受到影响我会感到惊讶。无论如何我想试试看。
我相信我的另一个选择是打开二进制日志记录并使用mysqlbinlog将二进制日志转换为人类可读的格式,但听起来通用查询日志会提供一种更简单的方法来获取我想要的内容。 / p>
答案 0 :(得分:28)
您可以在JDBC URL中启用日志记录,如下所示:
jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true
其他日志记录后端可用(CommonsLogger,Slf4jLogger,JDK14Logger)。我相信直接Log4J日志记录在某些时候由于许可问题而被删除,因此它可能不适用于您的JDBC驱动程序版本。
当然,您需要在类路径中使用相关的日志库JAR,以及配置文件(log4j.properties)。我会先将根级别设置为TRACE以查看发生了什么,并在看到记录的内容后按日志级别和类别将其收紧。
进一步阅读:
HTH
答案 1 :(得分:8)
将'logger'和'profileSQL'添加到jdbc url:
&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true
然后您将获得以下SQL语句:
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 message: SET sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 13 resultset: 17 message: select 1
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 13 resultset: 17
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 15 resultset: 18 message: select @@session.tx_read_only
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 15 resultset: 18
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 14 resultset: 0 message: update sequence set seq=seq+incr where name='demo' and seq=4602
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 14 resultset: 0
默认记录器是:
com.mysql.jdbc.log.StandardLogger
Mysql jdbc属性列表:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
答案 2 :(得分:3)
如果您正在使用Hibernate并通过它执行所有数据访问,则可以通过将属性hibernate.show_sql
设置为true来打开日志记录。但是,这将编写参数化语句(例如SELECT foo.id FROM foo WHERE foo.bar = ?
)。如果您需要参数值,或者不使用像Hibernate这样的工具,您可能需要让MySQL编写此日志。请参阅general query log上的MySQL文档。
FWIW,MySQL二进制日志是另一种手段;它记录对数据的更改,并用于增量备份和/或复制。 SELECT
语句不会记录在二进制日志中。
修改强> 通过在my.cnf中添加以下两行(确认两个变量都已设置)并重启MySQL后,我能够让MySQL编写一般日志:
general_log = 1
general_log_file=/tmp/mysql-general.log
答案 3 :(得分:3)
我最终找到了解决方法。我通过Java在运行时使用以下SQL查询修改MySQL全局系统变量来启用MySQL通用查询记录。
SET GLOBAL log_output="FILE"
SET GLOBAL general_log_file="Path/File"
SET GLOBAL general_log='ON'
我建议在general_log_file路径中使用正斜杠。即使在Windows环境中,也无法使用反斜杠。
我在运行时使用以下SQL查询禁用常规查询日志记录。
SET GLOBAL general_log='OFF'
答案 4 :(得分:0)
将MySQL连同 mysql-connector-java-8.0-13.jar 一起使用,我在JDBC连接URL中添加了以下内容:
&logger=com.mysql.cj.log.StandardLogger&profileSQL=true
文档参考:
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html
日志输出令人讨厌,因为它包含一个堆栈跟踪,指示查询在代码中的确切位置运行。如果有人想出一种排除堆栈跟踪的方法,请告诉我。
答案 5 :(得分:0)
对于 Spring Boot 的最新 MySQL 驱动程序版本,添加到 JDBC 连接 URL:
spring.datasource.url: jdbc:mysql://localhost:49172/INTEGRATION_DB?logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true
它将使用 Slf4J 记录器。如果没有这样的记录器,可以使用标准记录器:logger=com.mysql.cj.log.StandardLogger
也可以使用自定义记录器,只需实现接口 com.mysql.cj.log.Log
并在连接 URL 中指定一个新记录器。