Cetus增加了全量日志的功能,即可以按需要输出经由Cetus的所有SQL。通过全量日志,可以方便的进行问题排查、记录和统计SQL、安全审计等。
开启全量日志,会有一些性能损耗,因此需要按需合理使用。
默认情况下,全量日志功能是不开启的。该功能提供了3个命令、8个可配置参数和3个统计变量,下面依次介绍:
可以登录Cetus的admin端口,开启全量日志、关闭全量日志、或是查看全量日志模块的状态。
- 开启全量日志
sql log start;
成功开启全量日志,需要提前将sql-log-switch参数设置为ON,然后执行上述命令,否则会报错如下:
mysql> sql log start;
ERROR 1105 (07000): can not start sql log thread, because sql-log-switch = OFF
成功开启后,查看统计变量sql-log-state的状态变为:running,表示已经开启该功能。
- 关闭全量日志
sql log stop;
上述命令可以随时关闭全量日志,减少大量日志输出所带来的性能损耗。
- 查看全量日志状态
sql log status
上述命令可以将全量日志相关的变量进行汇总显示。
参数分为动态(Dynamic)变量和静态(Static)变量。动态变量可以动态修改,修改命令如下:
config set key=vale;
例如:
config set sql-log-switch = 'on';
- sql-log-buffersize
该参数可以指定全量日志的缓存大小,默认值为1M,该参数单位是B,不能动态配置。
- sql-log-switch
该参数控制全量日志功能是否可用,默认为OFF。该参数可配置的值有:OFF、ON和REALTIME。启动时若配置该参数为ON或是REALTIME,则启动后启动开启全量日志功能,该参数可以动态配置。ON和REALTIME的区别在于,REALTIME不仅将日志写入OS的缓存,同时调用fsync函数,将日志落盘。
- sql-log-prefix
该参数定义全量日志的文件名前缀,后缀默认均为.clg。该值默认为cetus,该参数不能动态配置。全量日志文件名组成为:前缀-进程号.后缀
- sql-log-path
该参数可以指定全量日志输出的路径,该值默认与basedir/logs/路径相同,如果路径不存在,尝试创建该目录,该参数不能动态配置。
- sql-log-maxsize
该值控制每个全量日志的最大容量,默认值为1024,0表示不限制文件大小,单位是M,该参数不能动态配置。如果当前日志量超过该值,则会rotate成历史日志文件。
- sql-log-mode
该值控制输出的全量日志的类型,默认为backend。该参数可配置的值包括:connect、client、front、backend、all,该参数支持动态配置。
- sql-log-idletime
该值控制全量日志的线程在没有日志可以写入文件的情况下,等待下写入的时间,默认500ms,单位毫秒,该参数支持动态设置。
- sql-log-maxnum
保留的历史文件的个数,默认为3,0表示不限制文件个数。
- sql-log-state
该统计变量表示当前全量日志线程是否启动,running表示启动,stopped表示未启动。
- sql-log-cached
该统计变量表示当前全量日志仍旧在内存中的大小,单位B。
- sql-log-cursize
该统计变量表示当前全量日志文件,写入的字节数,单位B。
可以通过参数sql-log-mode来设置不同模式的日志,各种模式的日志格式均不同。基本的模式有三种:connect、client和backend。如果希望同时打印connect、client,则可以设置为:front,如果希望打印所有日志,则可以设置为:all。
connect模式打印的是客户端连接Cetus时,客户端发送的auth认证包的主要内容。
client模式打印的是客户端发送的原始SQL语句等相关内容,该模式下,当Cetus接收到客户端的SQL请求后,立即打印该日志。
backend模式打印的是发送到SQL的语句等相关内容,该模式下,当MySQL将全部结果集发送回Cetus后才会打印该日志。
- connect模式下日志格式
2018-08-03 08:04:09.117: #connect# [email protected]:58426 Connect Cetus, C_id:2 C_db: C_charset:33 C_auth_plugin:mysql_native_password C_ssl:false C_cap:1ffa685 S_cap:80eff64f
C_id:客户端当前连接的ID,可以通过其来确定哪些是同一个连接
C_db:客户端auth认证包中携带的database信息
C_charset:客户端auth认证包中携带的charset的信息
C_auth_plugin: 使用的认证插件
C_ssl: 是否启用了ssl
C_cap: 客户端发送的权值信息
S_cap: Cetus发送的权值信息
- client模式下日志格式
2018-08-03 08:11:16.054: #client# C_ip:172.17.0.2:58426 C_db: C_usr:ght C_tx:false C_retry:0 C_id:2 type:Query select * from test1
C_ip: 客户端的IP、Port
C_db: 客户端当前的database信息
C_usr: 客户端的用户名
C_tx: 是否在事务中
C_retry: 客户端连接重试测试
C_id: 客户端当前连接的ID,可以通过其来确定哪些是同一个连接
type: SQL类型
- backend模式下 读写分离版本日志格式
2018-08-03 08:15:58.597: #backend-rw# C_ip:172.17.0.2:58426 C_db:ght C_usr:ght C_tx:true C_id:2 S_ip:172.17.0.3:3306 S_db:ght S_usr:ght S_id:24515 inj(type:3 bytes:0 rows:0) latency:0.759(ms) ERR type:Query select * from test1
C_ip: 客户端的IP、Port
C_db: 客户端当前的database信息
C_usr: 客户端的用户名
C_tx: 是否在事务中
C_id: 客户端当前连接的ID,可以通过其来确定哪些是同一个连接
S_ip: MySQL端的IP、Port
S_db: MySQL端当前的database信息
S_usr: MySQL端的用户名
S_id: MySQL当前连接的ID,可以通过其来确定哪些是同一个MySQL连接
inj-type: 语句的类型
inj-bytes: 结果集字节数
inj-rows: 影响行数
latency: 延迟
type: SQL类型
- backend模式下 分片版本日志格式
2018-08-09 10:34:51.619: #backend-sharding# C_ip:172.17.0.2:51428 C_db:ght C_usr:ght C_tx:false C_id:4 S_ip:172.17.0.3:3306 S_db:ght S_usr:ght S_id:27630 trans(in_xa:false xa_state:UNKNOWN) latency:1.504(ms) OK type:Query select * from s
C_ip: 客户端的IP、Port
C_db: 客户端当前的database信息
C_usr: 客户端的用户名
C_tx: 是否在事务中
C_id: 客户端当前连接的ID,可以通过其来确定哪些是同一个连接
S_ip: MySQL端的IP、Port
S_db: MySQL端当前的database信息
S_usr: MySQL端的用户名
S_id: MySQL当前连接的ID,可以通过其来确定哪些是同一个MySQL连接
in_xa: 是否在XA事务中
xa_state: 所处的XA事务的阶段
latency: 延迟
type: SQL类型
xa_state的类型包括如下内容:
UNKNOWN
NEXT_ST_XA_START
NEXT_ST_XA_QUERY
NEXT_ST_XA_END
NEXT_ST_XA_PREPARE
NEXT_ST_XA_COMMIT
NEXT_ST_XA_ROLLBACK
NEXT_ST_XA_CANDIDATE_OVER
NEXT_ST_XA_OVER
分片版本下,当调整连接状态时候,会打印如下日志:
2018-08-09 11:34:15.845: #backend-sharding# C_ip:172.17.0.2:51428 C_db:ght C_usr:ght C_tx:false C_id:4 trans(in_xa:false xa_state:UNKNOWN) attr_adj_state:8
C_ip: 客户端的IP、Port
C_db: 客户端当前的database信息
C_usr: 客户端的用户名
C_tx: 是否在事务中
C_id: 客户端当前连接的ID,可以通过其来确定哪些是同一个连接
in_xa: 是否在XA事务中
xa_state: 所处的XA事务的阶段
attr_adj_state: 调整的属性信息
attr_adj_state属性信息包括如下内容:
ATTR_START = 0
ATTR_DIF_CHANGE_USER = 1
ATTR_DIF_DEFAULT_DB = 2
ATTR_DIF_SQL_MODE = 4
ATTR_DIF_CHARSET = 8
ATTR_DIF_SET_OPTION = 16
ATTR_DIF_SET_AUTOCOMMIT = 32
- 启动时开启关闭全量日志功能
启动前,配置sql-log-switch=ON或是sql-log-switch=REALTIME,Cetus启动后会自动开启全量日志功能。
- 动态开启关闭全量日志功能
Cetus运行后可以在设置sql-log-switch=ON或是sql-log-switch=REALTIME的情况下,通过执行sql log start;动态的开启全量日志功能;当然也可以通过执行sql log stop;动态关闭该功能。如果暂时不希望使用该功能,尽量配置sql-log-switch=OFF。
- 设置日志自动rotate
参数sql-log-maxsize设置单个文件的最大容量,sql-log-maxnum设置保留的历史日志的个数。将这两个参数合理配置,便可以实现全量日志的自动rotate功能。