审计日志插件支持用户定义的函数,这些函数提供了一个SQL接口来读取json格式的审计日志文件。(此功能不适用于以其他格式写入的日志文件。)
当审计日志插件初始化并配置为JSON日志时,它使用包含当前审计日志文件的目录作为搜索可读审计日志文件的位置。属性的值确定文件的位置、基名和后缀audit_log_file
系统变量,然后查找文件名与以下模式匹配的文件,其中[…]
可选文件名部分:
basename(。时间戳]。后缀(. gz)[[。pwd_id] .enc]
如果文件名以.enc
,该文件是加密的,读取其未加密的内容需要从密匙环获得的解密密码。审计日志插件确定解密密码的keyring ID,如下所示:
如果
.enc
的前面有pwd_id
,密匙环ID为audit_log -
.pwd_id
如果
.enc
之前没有pwd_id
,该文件的名称是在实现审计日志加密密码历史记录之前的旧名称。keyring ID为audit_log
.
有关加密审计日志文件的详细信息,请参见加密审计日志文件.
插件会忽略手动重命名且不匹配模式的文件,以及使用密码加密的文件,这些文件在密匙环中不再可用。插件打开每个剩余的候选文件,验证文件实际包含的内容JSON
审计事件,并使用每个文件的第一个事件的时间戳对文件进行排序。结果是一个文件序列,可以使用读取日志的用户定义函数(udf)进行访问:
audit_log_read ()
从审计日志中读取事件或关闭读取过程。audit_log_read_bookmark ()
返回最近写入的审计日志事件的书签。这个书签适合传递给别人audit_log_read ()
指示从哪里开始阅读。
audit_log_read ()
选择一个可选的JSON
字符串参数,并且成功调用任一函数返回的结果为JSON
字符串。
使用这些函数读取审计日志,需要遵循以下原则:
调用
audit_log_read ()
从给定位置或当前位置开始读事件,或细读:若要初始化审计日志读取序列,请传递一个参数,该参数指示开始的位置。一种方法是传递返回的书签
audit_log_read_bookmark ()
:选择audit_log_read (audit_log_read_bookmark ());
若要继续从序列中的当前位置读取,请调用
audit_log_read ()
没有指定位置的:选择audit_log_read ();
若要显式地关闭读取序列,请传递
JSON
零
论点:选择audit_log_read(“空”);
没有必要明确地闭读。当会话结束或通过调用初始化一个新的读取序列时,读取将隐式关闭
audit_log_read ()
用一个参数表示开始的位置。
成功呼叫
audit_log_read ()
读取事件返回JSON
包含审计事件数组的字符串:如果返回数组的最终值不是
JSON
零
值时,在刚刚读取的和之后还有更多事件audit_log_read ()
可以再次调用以阅读更多。如果返回数组的最终值是a
JSON
零
值时,当前读序列中已没有剩余事件要读取。
每一个非
零
数组元素是一个事件,表示为JSON
散列。例如:[{“时间戳”:“2020-05-18 13:39:33”、“id”:0,“类”:“连接”、“事件”:“连接”,…},{“时间戳”:“2020-05-18 13:39:33”、“id”:1、“类”:“将军”,“事件”:“地位”,…},{“时间戳”:“2020-05-18 13:39:33”、“id”:2中,“类”:“连接”、“事件”:“断开”,…}, null]
有关json格式审计事件内容的详细信息,请参见JSON审计日志文件格式.
一个
audit_log_read ()
在以下任何一种情况下,调用未指定位置的读取事件将产生错误:读取序列尚未通过传递位置初始化
audit_log_read ()
.在当前读序列中没有更多事件需要读取;也就是说,
audit_log_read ()
先前返回以。结尾的数组JSON
零
价值。最近的读序列已通过传递
JSON
零
价值audit_log_read ()
.
要在这些条件下读取事件,必须首先通过调用初始化读取序列
audit_log_read ()
使用一个参数指定位置。
指定…的位置audit_log_read ()
,包括一个参数,表明从哪里开始阅读。例如,传递一个书签,它是一个JSON
散列包含时间戳
而且id
唯一标识特定事件的元素。下面是一个示例书签,通过调用audit_log_read_bookmark ()
功能:
SELECT audit_log_read_bookmark();+-------------------------------------------------+ | audit_log_read_bookmark () | +-------------------------------------------------+ | { " 时间戳”:“2020-05-18 21:03:44”、“id”:0 } | +-------------------------------------------------+
将当前书签传递给audit_log_read ()
从书签位置开始初始化事件读取:
mysql> SELECT audit_log_read();+-----------------------------------------------------------------------+ | audit_log_read (audit_log_read_bookmark ()) | +-----------------------------------------------------------------------+ | [ {" 时间戳”:“2020-05-18 22:41:24”、“id”:0,“类”:“连接”,…| +-----------------------------------------------------------------------+
论证audit_log_read ()
是可选的。如果存在,它可能是一个JSON
零
值关闭读取序列,或JSON
散列。
的哈希参数中audit_log_read ()
,项是可选的,并控制读取操作的各个方面,例如开始读取的位置或读取多少事件。以下项目是重要的(其他项目忽略):
开始
:第一个要读取的事件在审计日志中的位置。位置以时间戳形式给出,读取从时间戳值上或之后发生的第一个事件开始。的开始
Item的格式为价值
是一个文字时间戳值:"start": {"timestamp": "价值"}
的
开始
从MySQL 8.0.22开始允许使用。时间戳
,id
:第一个要读取的事件在审计日志中的位置。的时间戳
而且id
项目一起组成一个书签,唯一地标识一个特定的事件。如果一个audit_log_read ()
参数包含任一项,它必须同时包含两者才能完全指定位置,否则将发生错误。max_array_length
:从日志中读取的最大事件数。如果省略此项,默认情况下将读取到日志的末尾或读缓冲区已满,以先到者为准。
指定…的起始位置audit_log_read ()
,传递一个包含a的哈希参数开始
项目或书签组成时间戳
而且id
物品。如果一个哈希参数包含开始
项和书签时,将发生错误。
如果哈希参数未指定起始位置,则从当前位置继续读取。
的时间戳值如果不包含时间部分,则为00:00:00
假定。
接受的参数示例audit_log_read ()
:
从给定时间戳上或之后发生的第一个事件开始读取事件:
audit_log_read('{"开始":{“时间戳”:“2020-05-24 12:30:00”}}”)
和前面的例子一样,但是最多读取3个事件:
audit_log_read('{"开始":{“时间戳”:“2020-05-24 12:30:00”},“max_array_length”:3}”)
从当天或之后发生的第一个事件开始读取事件
2020-05-24就是
(时间戳不包括时间部分,因此00:00:00
假设):audit_log_read('{"开始":{“时间戳”:“2020-05-24”}}”)
从具有准确时间戳和事件ID的事件开始读取事件:
audit_log_read('{“时间戳”:“2020-05-24 12:30:00”、“id”:0}”)
和前面的例子一样,但是最多读取3个事件:
audit_log_read('{“时间戳”:“2020-05-24 12:30:00”、“id”:0,“max_array_length”:3}”)
从读序列中的当前位置读取事件:
audit_log_read ()
从读取序列的当前位置开始,最多读取5个事件:
Audit_log_read ('{"max_array_length": 5}')
关闭当前读序列:
audit_log_read(空的)
一个JSON
可以根据需要对日志读取函数返回的字符串进行操作。假设获取书签的调用产生如下值:
mysql> SET @mark:= audit_log_read_bookmark();mysql> SELECT @mark;+-------------------------------------------------+ | @ 马克 | +-------------------------------------------------+ | { " 时间戳”:“2020-05-18 16:10:28”、“id”:2 } | +-------------------------------------------------+
调用audit_log_read ()
使用该参数可以返回多个事件。限制audit_log_read ()
最多是阅读N
事件,添加到字符串amax_array_length
带有该值的项。例如,要读取单个事件,修改字符串如下:
mysql> SET @mark:= JSON_SET(@mark, '$。max_array_length ', 1);mysql> SELECT @mark;+----------------------------------------------------------------------+ | @ 马克 | +----------------------------------------------------------------------+ | {" id”:2,“时间戳”:“2020-05-18 16:10:28”、“max_array_length”:1 } | +----------------------------------------------------------------------+
当传递给时,修改后的字符串audit_log_read ()
,生成最多包含一个事件的结果,而不管有多少个可用事件。
在MySQL 8.0.19之前,审计日志udf的字符串返回值是二进制字符串。将二进制字符串与需要非二进制字符串的函数(例如操作JSON
Values),将其转换为非二进制字符串。例如,在将书签传递给JSON_SET ()
,将其转换为utf8mb4
如下:
SET @mark = CONVERT(@mark USING utf8mb4);
该语句甚至可以用于MySQL 8.0.19及更高版本;对于这些版本,它基本上是一个没有操作,是无害的。
设置一个字节数限制audit_log_read ()
读取,设置audit_log_read_buffer_size
系统变量。从MySQL 8.0.12开始,这个变量的默认值是32KB,可以在运行时设置。每个客户端应设置其会话值audit_log_read_buffer_size
适当地为其使用audit_log_read ()
.
每次呼叫audit_log_read ()
在缓冲区大小范围内返回尽可能多的可用事件。不符合缓冲区大小的事件将被跳过并生成警告。鉴于这种行为,在评估应用程序的适当缓冲区大小时,考虑以下因素:
在呼叫的数量之间有一个权衡
audit_log_read ()
以及每次调用返回的事件:使用更小的缓冲区大小,调用返回更少的事件,因此需要更多的调用。
缓冲区越大,调用返回的事件就越多,因此需要的调用就越少。
对于较小的缓冲区大小(例如默认大小为32KB),事件超过缓冲区大小从而被跳过的可能性更大。
在MySQL 8.0.12之前,audit_log_read_buffer_size
默认值为1MB,影响所有客户端,并且只能在服务器启动时更改。
有关审计日志读取功能的其他信息,请参见审计日志功能.