#### 6.4.5.4 审核日志文件格式

每当发生可审计事件时，MySQL 服务器调用审计日志插件将审计记录写入其日志文件。通常，插件启动后写入的第一条审计记录包含服务器描述和启动选项。其后的元素表示诸如客户端连接和断开连接事件、执行的 SQL 语句等事件。只记录顶级语句，而不是存储程序（如触发器或存储过程）中的语句。语句引用的文件的内容，例如[`加载数据`](load-data.html)不记录。

要选择审计日志插件用于写入其日志文件的日志格式，请设置[`审计日志格式`](audit-log-reference.html#sysvar_audit_log_format)服务器启动时的系统变量。这些格式可用：

-   新型 XML 格式（[`audit_log_format=新`](audit-log-reference.html#sysvar_audit_log_format))：一种 XML 格式，与旧式 XML 格式相比，它与 Oracle Audit Vault 的兼容性更好。MySQL 8.0 默认使用新式 XML 格式。

-   旧式 XML 格式 ([`audit_log_format=OLD`](audit-log-reference.html#sysvar_audit_log_format))：旧 MySQL 系列中默认使用的原始审计日志格式。

-   JSON 格式 ([`audit_log_format=JSON`](audit-log-reference.html#sysvar_audit_log_format))

    默认情况下，审计日志文件内容以新型 XML 格式编写，没有压缩或加密。

笔记

有关更改日志格式时要考虑的问题的信息，请参阅[选择审核日志文件格式](audit-log-logging-configuration.html#audit-log-file-format).

以下部分描述了可用的审计日志记录格式：

-   [新型 XML 审计日志文件格式](audit-log-file-formats.html#audit-log-file-new-style-xml-format)

-   [旧式 XML 审计日志文件格式](audit-log-file-formats.html#audit-log-file-old-style-xml-format)

-   [JSON 审计日志文件格式](audit-log-file-formats.html#audit-log-file-json-format)

##### 新型 XML 审计日志文件格式

这是一个新式 XML 格式的示例日志文件 ([`audit_log_format=新`](audit-log-reference.html#sysvar_audit_log_format))，为了可读性稍微重新格式化：

```
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
  <RECORD_ID>1_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Audit</NAME>
  <SERVER_ID>1</SERVER_ID>
  <VERSION>1</VERSION>
  <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
    --socket=/usr/local/mysql/mysql.sock
    --port=3306</STARTUP_OPTIONS>
  <OS_VERSION>i686-Linux</OS_VERSION>
  <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>2_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Connect</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
  <CONNECTION_ATTRIBUTES>
   <ATTRIBUTE>
    <NAME>_pid</NAME>
    <VALUE>42794</VALUE>
   </ATTRIBUTE>
   ...
   <ATTRIBUTE>
    <NAME>program_name</NAME>
    <VALUE>mysqladmin</VALUE>
   </ATTRIBUTE>
  </CONNECTION_ATTRIBUTES>
  <PRIV_USER>root</PRIV_USER>
  <PROXY_USER/>
  <DB>test</DB>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>6_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Query</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root[root] @ localhost [127.0.0.1]</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>drop_table</COMMAND_CLASS>
  <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:39 UTC</TIMESTAMP>
  <RECORD_ID>8_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:43 UTC</TIMESTAMP>
  <RECORD_ID>11_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>6</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
  <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
  <NAME>NoAudit</NAME>
  <SERVER_ID>1</SERVER_ID>
 </AUDIT_RECORD>
</AUDIT>
```

审核日志文件使用 UTF-8（每个字符最多 4 个字节）以 XML 形式编写。根元素是`<审计>`.根元素包含`<审计记录>`元素，每个元素都提供有关审计事件的信息。当审计日志插件开始写入新的日志文件时，它会写入 XML 声明并打开`<审计>`根元素标签。当插件关闭日志文件时，它会写入关闭`</审计>`根元素标签。文件打开时不存在结束标记。

内的元素`<审计记录>`元素具有以下特点：

-   一些元素出现在每个`<审计记录>`元素。其他是可选的，可能会根据审计记录类型出现。

-   元素的顺序`<审计记录>`不保证元素。

-   元素值不是固定长度。长值可能会被截断，如稍后给出的元素描述中所示。

-   这`<`,`>`,`"`， 和`&`字符被编码为`<`,`>`,`"`， 和`&`， 分别。NUL 字节 (U+00) 被编码为`?`特点。

-   作为 XML 字符无效的字符使用数字字符引用进行编码。有效的 XML 字符是：

    ```
    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    ```

    以下元素是强制性的`<审计记录>`元素：

-   `<名称>`

    表示生成审计事件的指令类型的字符串，例如服务器从客户端接收的命令。

    例子：

    ```
    <NAME>Query</NAME>
    ```

    一些常见的`<名称>`价值观：

    ```
    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off
    ```

    可能的值为`审计`,`二进制日志转储`,`更改用户`,`关闭 stmt`,`连接出`,`连接`,`创建数据库`, `守护进程`, `调试`, `延迟插入`, `删除数据库`, `执行`, `拿来`, `字段列表`, `初始化数据库`, `杀`, `长数据`, `无审计`, `平`, `准备`, `进程列表`, `询问`, `放弃`, `刷新`, `注册从站`, `重置 stmt`, `设置选项`, `关掉`, `睡觉`, `统计数据`, `表转储`, `表删除`, `表格插入`, `读表`, `表更新`, `时间`.

    其中许多值对应于`COM_*`xxx`*`中列出的命令值`我的命令.h`头文件。例如，`创建数据库`和`更改用户`相当于`COM_CREATE_DB`和`COM_CHANGE_USER`， 分别。

    事件有`<名称>`的值`桌子*`XXX`*`陪伴`询问`事件。例如，以下语句生成一个`询问`事件，二`读表`事件，和一个`表格插入`事件：

    ```
    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
    ```

    每个`桌子*`XXX`*`事件包含`<表格>`和`<数据库>`元素来标识事件所引用的表和包含该表的数据库。

-   `<RECORD_ID>`

    审计记录的唯一标识符。该值由序列号和时间戳组成，格式为`*`SEQ_TIMESTAMP`*`.当审计日志插件打开审计日志文件时，它会将序列号初始化为审计日志文件的大小，然后为记录的每条记录将序列号加 1。时间戳是 UTC 值`*`YYYY-MM-DD`*T*`hh:mm:ss`*`表示审计日志插件打开文件的日期和时间的格式。

    例子：

    ```
    <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
    ```

-   `<时间戳>`

    表示 UTC 值的字符串`*`YYYY-MM-DD`*T*`hh:mm:ss`* 世界标准时间`表示生成审计事件的日期和时间的格式。例如，从客户端接收到的与执行 SQL 语句相对应的事件有一个`<时间戳>`值在语句完成后出现，而不是在收到时出现。

    例子：

    ```
    <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
    ```

    以下元素是可选的`<审计记录>`元素。其中许多只发生在特定的`<名称>`元素值。

-   `<COMMAND_CLASS>`

    指示执行的操作类型的字符串。

    例子：

    ```
    <COMMAND_CLASS>drop_table</COMMAND_CLASS>
    ```

    这些值对应于`语句/sql/*`xxx`*`命令计数器。例如，*`xxx`*是`drop_table`和`选择`为了[`删除表`](drop-table.html)和[`选择`](select.html)声明，分别。以下语句显示可能的名称：

    ```
    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    ```

-   `<CONNECTION_ATTRIBUTES>`

    从 MySQL 8.0.19 开始，带有`<COMMAND_CLASS>`的价值`连接`可能包括一个`<CONNECTION_ATTRIBUTES>`元素来显示客户端在连接时传递的连接属性。（有关这些属性的信息，这些属性也在性能模式表中公开，请参阅[第 27.12.9 节，“性能模式连接属性表”](performance-schema-connection-attribute-tables.html).)

    这`<CONNECTION_ATTRIBUTES>`元素包含一个`<属性>`每个属性的元素，每个属性包含`<名称>`和`<值>`元素分别表示属性名称和值。

    例子：

    ```
    <CONNECTION_ATTRIBUTES>
     <ATTRIBUTE>
      <NAME>_pid</NAME>
      <VALUE>42794</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_os</NAME>
      <VALUE>macos0.14</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_platform</NAME>
      <VALUE>x86_64</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_version</NAME>
      <VALUE>8.0.19</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_name</NAME>
      <VALUE>libmysql</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>program_name</NAME>
      <VALUE>mysqladmin</VALUE>
     </ATTRIBUTE>
    </CONNECTION_ATTRIBUTES>
    ```

    如果事件中不存在连接属性，则不会记录任何连接属性，并且不会`<CONNECTION_ATTRIBUTES>`元素出现。如果连接尝试不成功，客户端未传递任何属性，或者连接发生在内部，例如在服务器启动期间或由插件启动时，就会发生这种情况。

-   `<CONNECTION_ID>`

    表示客户端连接标识符的无符号整数。这与返回的值相同[`CONNECTION_ID()`](information-functions.html#function_connection-id)会话中的功能。

    例子：

    ```
    <CONNECTION_ID>127</CONNECTION_ID>
    ```

-   `<CONNECTION_TYPE>`

    与服务器的连接的安全状态。允许的值为`TCP/IP`（未加密建立的 TCP/IP 连接），`SSL/TLS`（使用加密建立的 TCP/IP 连接），`插座`（Unix套接字文件连接），`命名管道`（Windows 命名管道连接），以及`共享内存`（Windows 共享内存连接）。

    例子：

    ```
    <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
    ```

-   `<数据库>`

    表示数据库名称的字符串。

    例子：

    ```
    <DB>test</DB>
    ```

    对于连接事件，该元素表示默认数据库；如果没有默认数据库，则该元素为空。对于表访问事件，该元素指示访问的表所属的数据库。

-   `<主机>`

    表示客户端主机名的字符串。

    例子：

    ```
    <HOST>localhost</HOST>
    ```

-   `<IP>`

    表示客户端 IP 地址的字符串。

    例子：

    ```
    <IP>127.0.0.1</IP>
    ```

-   `<MYSQL_VERSION>`

    表示 MySQL 服务器版本的字符串。这与[`版本（）`](information-functions.html#function_version)功能或[`版本`](server-system-variables.html#sysvar_version)系统变量。

    例子：

    ```
    <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
    ```

-   `<OS_LOGIN>`

    一个字符串，表示在身份验证过程中使用的外部用户名，由用于验证客户端的插件设置。使用本机（内置）MySQL 身份验证，或者如果插件未设置该值，则此元素为空。该值与该值相同[`外部用户`](server-system-variables.html#sysvar_external_user)系统变量（见[第 6.2.19 节，“代理用户”](proxy-users.html)）。

    例子：

    ```
    <OS_LOGIN>jeffrey</OS_LOGIN>
    ```

-   `<操作系统版本>`

    一个字符串，表示构建或运行服务器的操作系统。

    例子：

    ```
    <OS_VERSION>x86_64-Linux</OS_VERSION>
    ```

-   `<PRIV_USER>`

    一个字符串，表示服务器对客户端进行身份验证的用户。这是服务器用于权限检查的用户名，可能与`<用户>`价值。

    例子：

    ```
    <PRIV_USER>jeffrey</PRIV_USER>
    ```

-   `<代理用户>`

    代表代理用户的字符串（请参阅[第 6.2.19 节，“代理用户”](proxy-users.html)）。如果用户代理无效，则该值为空。

    例子：

    ```
    <PROXY_USER>developer</PROXY_USER>
    ```

-   `<SERVER_ID>`

    表示服务器 ID 的无符号整数。这与[`server_id`](replication-options.html#sysvar_server_id)系统变量。

    例子：

    ```
    <SERVER_ID>1</SERVER_ID>
    ```

-   `<SQLTEXT>`

    表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样，是使用 UTF-8 编写的（每个字符最多 4 个字节），因此该值可能是转换的结果。例如，原始语句可能已作为 SJIS 字符串从客户端接收。

    例子：

    ```
    <SQLTEXT>DELETE FROM t1</SQLTEXT>
    ```

-   `<STARTUP_OPTIONS>`

    一个字符串，表示 MySQL 服务器启动时在命令行或选项文件中给出的选项。第一个选项是服务器可执行文件的路径。

    例子：

    ```
    <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
      --port=3306 --log_output=FILE</STARTUP_OPTIONS>
    ```

-   `<状态>`

    表示命令状态的无符号整数：0 表示成功，非零表示发生错误。这与[`mysql_errno()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-errno.html)C API 函数。请参阅说明`<状态码>`有关它与`<状态>`.

    审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联，请参见[服务器错误消息参考](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html).

    不记录警告。

    例子：

    ```
    <STATUS>1051</STATUS>
    ```

-   `<状态码>`

    表示命令状态的无符号整数：0 表示成功，1 表示发生错误。

    这`STATUS_CODE`值不同于`状态`价值：`STATUS_CODE`成功为0，错误为1，与EZ兼容\_Audit Vault 的收集器使用者。`状态`是的价值[`mysql_errno()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-errno.html)C API 函数。这是 0 表示成功，非零表示错误，因此不一定是 1 表示错误。

    例子：

    ```
    <STATUS_CODE>0</STATUS_CODE>
    ```

-   `<表格>`

    表示表名的字符串。

    例子：

    ```
    <TABLE>t3</TABLE>
    ```

-   `<用户>`

    表示客户端发送的用户名的字符串。这可能不同于`<PRIV_USER>`价值。

    例子：

    ```
    <USER>root[root] @ localhost [127.0.0.1]</USER>
    ```

-   `<版本>`

    一个无符号整数，表示审计日志文件格式的版本。

    例子：

    ```
    <VERSION>1</VERSION>
    ```

##### 旧式 XML 审计日志文件格式

这是旧式 XML 格式的示例日志文件 ([`audit_log_format=OLD`](audit-log-reference.html#sysvar_audit_log_format))，为了可读性稍微重新格式化：

```
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:00 UTC"
    RECORD_ID="1_2019-10-03T14:25:00"
    NAME="Audit"
    SERVER_ID="1"
    VERSION="1"
    STARTUP_OPTIONS="--port=3306"
    OS_VERSION="i686-Linux"
    MYSQL_VERSION="5.7.21-log"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="2_2019-10-03T14:25:00"
    NAME="Connect"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"
    PRIV_USER="root"
    PROXY_USER=""
    DB="test"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="6_2019-10-03T14:25:00"
    NAME="Query"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root[root] @ localhost [127.0.0.1]"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="drop_table"
    SQLTEXT="DROP TABLE IF EXISTS t"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="8_2019-10-03T14:25:00"
    NAME="Quit"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:32 UTC"
    RECORD_ID="12_2019-10-03T14:25:00"
    NAME="NoAudit"
    SERVER_ID="1"/>
</AUDIT>
```

审核日志文件使用 UTF-8（每个字符最多 4 个字节）以 XML 形式编写。根元素是`<审计>`.根元素包含`<审计记录>`元素，每个元素都提供有关审计事件的信息。当审计日志插件开始写入新的日志文件时，它会写入 XML 声明并打开`<审计>`根元素标签。当插件关闭日志文件时，它会写入关闭`</审计>`根元素标签。文件打开时不存在结束标记。

的属性`<审计记录>`元素具有以下特点：

-   一些属性出现在每个`<审计记录>`元素。其他是可选的，可能会根据审计记录类型出现。

-   属性中的顺序`<审计记录>`不保证元素。

-   属性值不是固定长度。长值可能会被截断，如稍后给出的属性描述中所示。

-   这`<`,`>`,`"`， 和`&`字符被编码为`<`,`>`,`"`， 和`&`， 分别。NUL 字节 (U+00) 被编码为`?`特点。

-   作为 XML 字符无效的字符使用数字字符引用进行编码。有效的 XML 字符是：

    ```
    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    ```

    以下属性在每个属性中都是必需的`<审计记录>`元素：

-   `姓名`

    表示生成审计事件的指令类型的字符串，例如服务器从客户端接收的命令。

    例子：`NAME="查询"`

    一些常见的`姓名`价值观：

    ```
    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off
    ```

    可能的值为`审计`, `二进制日志转储`, `更改用户`, `关闭 stmt`, `连接出`, `连接`, `创建数据库`, `守护进程`, `调试`, `延迟插入`, `删除数据库`, `执行`, `拿来`, `字段列表`, `初始化数据库`, `杀`, `长数据`, `无审计`, `平`, `准备`, `进程列表`, `询问`, `放弃`, `刷新`, `注册从站`, `重置 stmt`, `设置选项`, `关掉`, `睡觉`, `统计数据`, `表转储`,`表删除`,`表格插入`,`读表`,`表更新`,`时间`.

    其中许多值对应于`COM_*`xxx`*`中列出的命令值`我的命令.h`头文件。例如，`“创建数据库”`和`“更改用户”`相当于`COM_CREATE_DB`和`COM_CHANGE_USER`， 分别。

    事件有`姓名`的值`桌子*`XXX`*`陪伴`询问`事件。例如，以下语句生成一个`询问`事件，二`读表`事件，和一个`表格插入`事件：

    ```
    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
    ```

    每个`桌子*`XXX`*`事件有`桌子`和`D B`属性来标识事件所引用的表和包含该表的数据库。

    `连接`旧式 XML 审计日志格式的事件不包括连接属性。

-   `RECORD_ID`

    审计记录的唯一标识符。该值由序列号和时间戳组成，格式为`*`SEQ_TIMESTAMP`*`.当审计日志插件打开审计日志文件时，它会将序列号初始化为审计日志文件的大小，然后为记录的每条记录将序列号加 1。时间戳是 UTC 值`*`YYYY-MM-DD`*T*`hh:mm:ss`*`表示审计日志插件打开文件的日期和时间的格式。

    例子：`RECORD_ID="12_2019-10-03T14:25:00"`

-   `时间戳`

    表示 UTC 值的字符串`*`YYYY-MM-DD`*T*`hh:mm:ss`* 世界标准时间`表示生成审计事件的日期和时间的格式。例如，从客户端接收到的与执行 SQL 语句相对应的事件有一个`时间戳`值在语句完成后出现，而不是在收到时出现。

    例子：`TIMESTAMP="2019-10-03T14:25:32 UTC"`

    以下属性是可选的`<审计记录>`元素。其中许多只发生在具有特定值的元素`姓名`属性。

-   `COMMAND_CLASS`

    指示执行的操作类型的字符串。

    例子：`COMMAND_CLASS="drop_table"`

    这些值对应于`语句/sql/*`xxx`*`命令计数器。例如，*`xxx`*是`drop_table`和`选择`为了[`删除表`](drop-table.html)和[`选择`](select.html)声明，分别。以下语句显示可能的名称：

    ```
    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    ```

-   `CONNECTION_ID`

    表示客户端连接标识符的无符号整数。这与返回的值相同[`CONNECTION_ID()`](information-functions.html#function_connection-id)会话中的功能。

    例子：`CONNECTION_ID="127"`

-   `连接类型`

    与服务器的连接的安全状态。允许的值为`TCP/IP`（未加密建立的 TCP/IP 连接），`SSL/TLS`（使用加密建立的 TCP/IP 连接），`插座`（Unix套接字文件连接），`命名管道`（Windows 命名管道连接），以及`共享内存`（Windows 共享内存连接）。

    例子：`CONNECTION_TYPE="SSL/TLS"`

-   `D B`

    表示数据库名称的字符串。

    例子：`数据库=“测试”`

    对于连接事件，该属性表示默认数据库；如果没有默认数据库，则该属性为空。对于表访问事件，该属性指示访问的表所属的数据库。

-   `主持人`

    表示客户端主机名的字符串。

    例子：`主机=“本地主机”`

-   `知识产权`

    表示客户端 IP 地址的字符串。

    例子：`IP="127.0.0.1"`

-   `MYSQL_VERSION`

    表示 MySQL 服务器版本的字符串。这与[`版本（）`](information-functions.html#function_version)功能或[`版本`](server-system-variables.html#sysvar_version)系统变量。

    例子：`MYSQL_VERSION="5.7.21-日志"`

-   `OS_LOGIN`

    一个字符串，表示在身份验证过程中使用的外部用户名，由用于验证客户端的插件设置。使用本机（内置）MySQL 身份验证，或者如果插件未设置该值，则此属性为空。该值与该值相同[`外部用户`](server-system-variables.html#sysvar_external_user)系统变量（见[第 6.2.19 节，“代理用户”](proxy-users.html)）。

    例子：`OS_LOGIN="杰弗里"`

-   `操作系统版本`

    一个字符串，表示构建或运行服务器的操作系统。

    例子：`OS_VERSION="x86_64-Linux"`

-   `PRIV_USER`

    一个字符串，表示服务器对客户端进行身份验证的用户。这是服务器用于权限检查的用户名，它可能与`用户`价值。

    例子：`PRIV_USER="杰弗里"`

-   `PROXY_USER`

    代表代理用户的字符串（请参阅[第 6.2.19 节，“代理用户”](proxy-users.html)）。如果用户代理无效，则该值为空。

    例子：`PROXY_USER="开发者"`

-   `SERVER_ID`

    表示服务器 ID 的无符号整数。这与[`server_id`](replication-options.html#sysvar_server_id)系统变量。

    例子：`SERVER_ID="1"`

-   `SQLTEXT`

    表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样，是使用 UTF-8 编写的（每个字符最多 4 个字节），因此该值可能是转换的结果。例如，原始语句可能已作为 SJIS 字符串从客户端接收。

    例子：`SQLTEXT="从 t1 删除"`

-   `STARTUP_OPTIONS`

    一个字符串，表示 MySQL 服务器启动时在命令行或选项文件中给出的选项。

    例子：`STARTUP_OPTIONS="--port=3306 --log_output=FILE"`

-   `状态`

    表示命令状态的无符号整数：0 表示成功，非零表示发生错误。这与[`mysql_errno()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-errno.html)C API 函数。请参阅说明`STATUS_CODE`有关它与`状态`.

    审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联，请参见[服务器错误消息参考](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html).

    不记录警告。

    例子：`状态="1051"`

-   `STATUS_CODE`

    表示命令状态的无符号整数：0 表示成功，1 表示发生错误。

    这`STATUS_CODE`值不同于`状态`价值：`STATUS_CODE`成功为0，错误为1，与EZ兼容\_Audit Vault 的收集器使用者。`状态`是的价值[`mysql_errno()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-errno.html)C API 函数。这是 0 表示成功，非零表示错误，因此不一定是 1 表示错误。

    例子：`STATUS_CODE="0"`

-   `桌子`

    表示表名的字符串。

    例子：`表="t3"`

-   `用户`

    表示客户端发送的用户名的字符串。这可能不同于`PRIV_USER`价值。

-   `版本`

    一个无符号整数，表示审计日志文件格式的版本。

    例子：`版本=“1”`

##### JSON 审计日志文件格式

对于 JSON 格式的审计日志（[`audit_log_format=JSON`](audit-log-reference.html#sysvar_audit_log_format))，日志文件内容形成一个[`JSON`](json.html)数组，每个数组元素表示一个审计事件[`JSON`](json.html)键值对的散列。完整事件记录的示例将在本节后面显示。以下是部分事件的摘录：

```
[
  {
    "timestamp": "2019-10-03 13:50:01",
    "id": 0,
    "class": "audit",
    "event": "startup",
    ...
  },
  {
    "timestamp": "2019-10-03 15:02:32",
    "id": 0,
    "class": "connection",
    "event": "connect",
    ...
  },
  ...
  {
    "timestamp": "2019-10-03 17:37:26",
    "id": 0,
    "class": "table_access",
    "event": "insert",
      ...
  }
  ...
]
```

审计日志文件使用 UTF-8（每个字符最多 4 个字节）写入。当审计日志插件开始写入新的日志文件时，它会写入开头`[`数组标记。当插件关闭日志文件时，它会写入关闭`]`数组标记。文件打开时不存在结束标记。

审计记录中的项目具有以下特征：

-   有些项目出现在每条审计记录中。其他是可选的，可能会根据审计记录类型出现。

-   不保证审计记录中的项目顺序。

-   项目值不是固定长度。长值可能会被截断，如后面给出的项目描述中所示。

-   这`"`和`\`字符被编码为`\"`和`\\`， 分别。

    以下示例显示了不同事件类型的 JSON 对象格式（如`班级`和`事件`项目），为了可读性而稍微重新格式化：

    审核启动事件：


```
{ "timestamp": "2019-10-03 14:21:56",
  "id": 0,
  "class": "audit",
  "event": "startup",
  "connection_id": 0,
  "startup_data": { "server_id": 1,
                    "os_version": "i686-Linux",
                    "mysql_version": "5.7.21-log",
                    "args": ["/usr/local/mysql/bin/mysqld",
                             "--loose-audit-log-format=JSON",
                             "--log-error=log.err",
                             "--pid-file=mysqld.pid",
                             "--port=3306" ] } }
```

当审计日志插件由于服务器启动而启动时（而不是在运行时启用），`连接ID`设置为 0，并且`帐户`和`登录`不存在。

审核关闭事件：

```
{ "timestamp": "2019-10-03 14:28:20",
  "id": 3,
  "class": "audit",
  "event": "shutdown",
  "connection_id": 0,
  "shutdown_data": { "server_id": 1 } }
```

当由于服务器关闭而卸载审计日志插件时（而不是在运行时被禁用），`连接ID`设置为 0，并且`帐户`和`登录`不存在。

连接或更改用户事件：

```
{ "timestamp": "2019-10-03 14:23:18",
  "id": 1,
  "class": "connection",
  "event": "connect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl",
                       "status": 0,
                       "db": "test",
                       "connection_attributes": {
                         "_pid": "43236",
                         ...
                         "program_name": "mysqladmin"
                       } }
}
```

断开连接事件：

```
{ "timestamp": "2019-10-03 14:24:45",
  "id": 3,
  "class": "connection",
  "event": "disconnect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl" } }
```

查询事件：

```
{ "timestamp": "2019-10-03 14:23:35",
  "id": 2,
  "class": "general",
  "event": "status",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "general_data": { "command": "Query",
                    "sql_command": "show_variables",
                    "query": "SHOW VARIABLES",
                    "status": 0 } }
```

表访问事件（读取、删除、插入、更新）：

```
{ "timestamp": "2019-10-03 14:23:41",
  "id": 0,
  "class": "table_access",
  "event": "insert",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
  "table_access_data": { "db": "test",
                         "table": "t1",
                         "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                         "sql_command": "insert" } }
```

以下列表中的项目出现在 JSON 格式审计记录的顶层： 每个项目值要么是标量，要么是[`JSON`](json.html)哈希。对于具有散列值的项目，描述仅列出该散列中的项目名称。有关二级散列项的更完整描述，请参阅本节后面部分。

-   `帐户`

    与事件关联的 MySQL 帐户。该值是包含这些项目的哈希值，相当于[`当前用户（）`](information-functions.html#function_current-user)部分内的功能：`用户`,`主持人`.

    例子：

    ```
    "account": { "user": "root", "host": "localhost" }
    ```

-   `班级`

    表示事件类的字符串。类定义事件的类型，当与`事件`指定事件子类的项。

    例子：

    ```
    "class": "connection"
    ```

    下表显示了允许的组合`班级`和`事件`价值观。

    [](<>)

    **表 6.33 审计日志类和事件组合**

    | 类值 | 允许的事件值 |
    | --- | ------ |
    | `审计` | `启动`,`关掉` |
    | `联系` | `连接`,`更改用户`,`断开` |
    | `一般的` | `状态` |
    | `table_access_data` | `读`,`删除`,`插入`,`更新` |

-   `连接数据`

    有关客户端连接的信息。该值是包含以下项目的哈希：`连接类型`,`状态`,`D b`，并且可能`连接属性`.此项目仅适用于具有`班级`的价值`联系`.

    例子：

    ```
    "connection_data": { "connection_type": "ssl",
                         "status": 0,
                         "db": "test" }
    ```

    从 MySQL 8.0.19 开始，带有`班级`的价值`联系`和`事件`的价值`连接`可能包括一个`连接属性`项目显示连接时客户端传递的连接属性。（有关这些属性的信息，这些属性也在性能模式表中公开，请参阅[第 27.12.9 节，“性能模式连接属性表”](performance-schema-connection-attribute-tables.html).)

    这`连接属性`value 是一个散列，它通过名称和值表示每个属性。

    例子：

    ```
    "connection_attributes": {
      "_pid": "43236",
      "_os": "macos0.14",
      "_platform": "x86_64",
      "_client_version": "8.0.19",
      "_client_name": "libmysql",
      "program_name": "mysqladmin"
    }
    ```

    如果事件中不存在连接属性，则不会记录任何连接属性，并且不会`连接属性`项出现。如果连接尝试不成功，客户端未传递任何属性，或者连接发生在内部，例如在服务器启动期间或由插件启动时，就会发生这种情况。

-   `连接ID`

    表示客户端连接标识符的无符号整数。这与返回的值相同[`CONNECTION_ID()`](information-functions.html#function_connection-id)会话中的功能。

    例子：

    ```
    "connection_id": 5
    ```

-   `事件`

    表示事件类的子类的字符串。子类定义事件的类型，当与`班级`指定事件类的项。有关详细信息，请参阅`班级`商品描述。

    例子：

    ```
    "event": "connect"
    ```

-   `通用数据`

    有关已执行语句或命令的信息。该值是包含以下项目的哈希：`命令`,`sql_command`,`询问`,`状态`.此项目仅适用于具有`班级`的价值`一般的`.

    例子：

    ```
    "general_data": { "command": "Query",
                      "sql_command": "show_variables",
                      "query": "SHOW VARIABLES",
                      "status": 0 }
    ```

-   `id`

    表示事件 ID 的无符号整数。

    例子：

    ```
    "id": 2
    ```

    对于具有相同的审计记录`时间戳`价值，他们的`id`值区分它们并形成一个序列。在审计日志中，`时间戳`/`id`对是唯一的。这些对是标识日志中事件位置的书签。

-   `登录`

    指示客户端如何连接到服务器的信息。该值是包含以下项目的哈希：`用户`,`操作系统`,`ip`,`代理`.

    例子：

    ```
    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
    ```

-   `关机数据`

    有关审计日志插件终止的信息。该值是包含以下项目的哈希：`server_id`此项目仅出现在审计记录中`班级`和`事件`的值`审计`和`关掉`， 分别。

    例子：

    ```
    "shutdown_data": { "server_id": 1 }
    ```

-   `启动数据`

    有关审计日志插件初始化的信息。该值是包含以下项目的哈希：`server_id`,`操作系统版本`,`mysql_version`,`参数`.此项目仅出现在审计记录中`班级`和`事件`的值`审计`和`启动`， 分别。

    例子：

    ```
    "startup_data": { "server_id": 1,
                      "os_version": "i686-Linux",
                      "mysql_version": "5.7.21-log",
                      "args": ["/usr/local/mysql/bin/mysqld",
                               "--loose-audit-log-format=JSON",
                               "--log-error=log.err",
                               "--pid-file=mysqld.pid",
                               "--port=3306" ] }
    ```

-   `table_access_data`

    有关访问表的信息。该值是包含以下项目的哈希：`D b`,`桌子`,`询问`,`sql_command`, 此项目仅出现在带有`班级`的价值`表访问`.

    例子：

    ```
    "table_access_data": { "db": "test",
                           "table": "t1",
                           "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                           "sql_command": "insert" }
    ```

-   `时间`

    该字段类似于`时间戳`字段，但该值为整数，表示 UNIX 时间戳值，指示生成审计事件的日期和时间。

    例子：

    ```
    "time" : 1618498687
    ```

    这`时间`字段仅在 JSON 格式的日志文件中出现[`audit_log_format_unix_timestamp`](audit-log-reference.html#sysvar_audit_log_format_unix_timestamp)系统变量已启用。

-   `时间戳`

    表示 UTC 值的字符串*`YYYY-MM-DD hh:mm:ss`*表示生成审计事件的日期和时间的格式。例如，从客户端接收到的与执行 SQL 语句相对应的事件有一个`时间戳`值在语句完成后出现，而不是在收到时出现。

    例子：

    ```
    "timestamp": "2019-10-03 13:50:01"
    ```

    对于具有相同的审计记录`时间戳`价值，他们的`id`值区分它们并形成一个序列。在审计日志中，`时间戳`/`id`对是唯一的。这些对是标识日志中事件位置的书签。

    这些项目出现在与 JSON 格式审计记录的顶级项目关联的哈希值中：

-   `参数`

    MySQL 服务器启动时在命令行或选项文件中给出的选项数组。第一个选项是服务器可执行文件的路径。

    例子：

    ```
    "args": ["/usr/local/mysql/bin/mysqld",
             "--loose-audit-log-format=JSON",
             "--log-error=log.err",
             "--pid-file=mysqld.pid",
             "--port=3306" ]
    ```

-   `命令`

    表示生成审计事件的指令类型的字符串，例如服务器从客户端接收的命令。

    例子：

    ```
    "command": "Query"
    ```

-   `连接类型`

    与服务器的连接的安全状态。允许的值为`tcp/ip`（未加密建立的 TCP/IP 连接），`ssl`（使用加密建立的 TCP/IP 连接），`插座`（Unix套接字文件连接），`命名管道`（Windows 命名管道连接），以及`共享内存`（Windows 共享内存连接）。

    例子：

    ```
    "connection_type": "tcp/tcp"
    ```

-   `D b`

    表示数据库名称的字符串。为了`连接数据`，它是默认数据库。为了`table_access_data`，它是表数据库。

    例子：

    ```
    "db": "test"
    ```

-   `主持人`

    表示客户端主机名的字符串。

    例子：

    ```
    "host": "localhost"
    ```

-   `ip`

    表示客户端 IP 地址的字符串。

    例子：

    ```
    "ip": "::1"
    ```

-   `mysql_version`

    表示 MySQL 服务器版本的字符串。这与[`版本（）`](information-functions.html#function_version)功能或[`版本`](server-system-variables.html#sysvar_version)系统变量。

    例子：

    ```
    "mysql_version": "5.7.21-log"
    ```

-   `操作系统`

    一个字符串，表示在身份验证过程中使用的外部用户名，由用于验证客户端的插件设置。使用本机（内置）MySQL 身份验证，或者如果插件未设置该值，则此属性为空。该值与该值相同[`外部用户`](server-system-variables.html#sysvar_external_user)系统变量。看[第 6.2.19 节，“代理用户”](proxy-users.html).

    例子：

    ```
    "os": "jeffrey"
    ```

-   `操作系统版本`

    一个字符串，表示构建或运行服务器的操作系统。

    例子：

    ```
    "os_version": "i686-Linux"
    ```

-   `代理`

    代表代理用户的字符串（请参阅[第 6.2.19 节，“代理用户”](proxy-users.html)）。如果用户代理无效，则该值为空。

    例子：

    ```
    "proxy": "developer"
    ```

-   `询问`

    表示 SQL 语句文本的字符串。该值可以为空。长值可能会被截断。该字符串与审计日志文件本身一样，是使用 UTF-8 编写的（每个字符最多 4 个字节），因此该值可能是转换的结果。例如，原始语句可能已作为 SJIS 字符串从客户端接收。

    例子：

    ```
    "query": "DELETE FROM t1"
    ```

-   `server_id`

    表示服务器 ID 的无符号整数。这与[`server_id`](replication-options.html#sysvar_server_id)系统变量。

    例子：

    ```
    "server_id": 1
    ```

-   `sql_command`

    指示 SQL 语句类型的字符串。

    例子：

    ```
    "sql_command": "insert"
    ```

    这些值对应于`语句/sql/*`xxx`*`命令计数器。例如，*`xxx`*是`drop_table`和`选择`为了[`删除表`](drop-table.html)和[`选择`](select.html)声明，分别。以下语句显示可能的名称：

    ```
    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    ```

-   `状态`

    表示命令状态的无符号整数：0 表示成功，非零表示发生错误。这与[`mysql_errno()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-errno.html)C API 函数。

    审计日志不包含 SQLSTATE 值或错误消息。要查看错误代码、SQLSTATE 值和消息之间的关联，请参见[服务器错误消息参考](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html).

    不记录警告。

    例子：

    ```
    "status": 1051
    ```

-   `桌子`

    表示表名的字符串。

    例子：

    ```
    "table": "t1"
    ```

-   `用户`

    表示用户名的字符串。含义因项目而异`用户`发生：

    -   之内`帐户`项目，`用户`是一个字符串，表示服务器对客户端进行身份验证的用户。这是服务器用于权限检查的用户名。

    -   之内`登录`项目，`用户`是一个字符串，表示客户端发送的用户名。

        例子：

    ```
    "user": "root"
    ```
