使用JDBC启用MySQL通用查询日志

alf*_*ugh 16 mysql logging jdbc

有没有办法通过JDBC启用MySQL通用查询记录?我通过搜索找到的最接近的东西是通过JDBC记录慢查询的能力(http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html).也许我应该这样做并将慢查询阈值设置为0毫秒?

我想以人类可读的格式通过MySQL记录所有查询,并希望指定应该写入日志文件的位置.我知道我会受到性能影响,但我的应用程序只有一个用户并且非常简单,如果性能受到影响我会感到惊讶.无论如何我想试试看.

我相信我的另一个选择是打开二进制日志记录并使用mysqlbinlog将二进制日志转换为人类可读的格式,但听起来通用查询日志会提供一种更简单的方法来获取我想要的内容.

Fra*_*ans 31

您可以在JDBC URL中启用日志记录,如下所示:

jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true
Run Code Online (Sandbox Code Playgroud)

其他日志后端可用(CommonsLogger,Slf4jLogger,JDK14Logger).我相信直接Log4J日志记录在某些时候由于许可问题而被删除,因此它可能不适用于您的JDBC驱动程序版本.

当然,您需要在类路径中使用相关的日志库JAR,以及配置文件(log4j.properties).我会先将根级别设置为TRACE以查看发生了什么,并在看到记录的内容后按日志级别和类别将其收紧.

进一步阅读:

HTH

  • 最近,日志包已移至“ com.mysql.cj.log”,例如“ com.mysql.cj.log.Slf4JLogger”。 (2认同)

imx*_*ylz 10

将'logger'和'profileSQL'添加到jdbc url:

&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true
Run Code Online (Sandbox Code Playgroud)

然后你将得到下面的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
Run Code Online (Sandbox Code Playgroud)

默认记录器是:

com.mysql.jdbc.log.StandardLogger
Run Code Online (Sandbox Code Playgroud)

Mysql jdbc属性列表:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html


alf*_*ugh 3

我最终找到了解决方法。我通过 Java 在运行时使用以下 SQL 查询修改 MySQL 全局系统变量来启用 MySQL 常规查询日志记录。

SET GLOBAL log_output="FILE"
SET GLOBAL general_log_file="Path/File"
SET GLOBAL general_log='ON'
Run Code Online (Sandbox Code Playgroud)

我建议在 General_log_file 路径中使用正斜杠。即使在 Windows 环境中,我也无法使用反斜杠。

我使用以下 SQL 查询在运行时禁用常规查询日志记录。

SET GLOBAL general_log='OFF'
Run Code Online (Sandbox Code Playgroud)