#### 5.4.2.9 错误日志输出格式

每个错误日志接收器（写入器）组件都有其用于将消息写入其目的地的特征输出格式，但其他因素可能会影响消息的内容：

-   日志接收器可用的信息。如果在执行接收器组件之前执行的日志过滤器组件删除了日志事件字段，则该字段不可用于写入。有关日志过滤的信息，请参阅[第 5.4.2.4 节，“错误日志过滤的类型”](error-log-filtering.html).

-   与日志接收器相关的信息。并非每个接收器都会写入错误事件中可用的所有字段。

-   系统变量可能会影响日志接收器。看[影响错误日志格式的系统变量](error-log-format.html#error-log-format-system-variables).

    有关错误事件中字段的名称和描述，请参阅[第 5.4.2.3 节，“错误事件字段”](error-log-event-fields.html).对于所有日志接收器，错误日志消息中包含的线程 ID 是其中的线程 ID[**mysqld**](mysqld.html)负责写消息。该ID表示该消息是由服务器的哪一部分产生的，与一般查询日志和慢查询日志消息一致，都包含连接线程ID。

-   [日志\_下沉\_内部输出格式](error-log-format.html#error-log-format-output-format-for-log-sink-internal)

-   [日志\_下沉\_json输出格式](error-log-format.html#error-log-format-output-format-for-log-sink-json)

-   [日志\_下沉\_syseventlog 输出格式](error-log-format.html#error-log-format-output-format-for-log-sink-syseventlog)

-   [早期启动日志输出格式](error-log-format.html#error-log-format-output-format-for-early-logging)

-   [影响错误日志格式的系统变量](error-log-format.html#error-log-format-system-variables)

##### 日志\_下沉\_内部输出格式

内部日志接收器产生传统的错误日志输出。例如：

```
2020-08-06T14:25:02.835618Z 0 [Note] [MY-012487] [InnoDB] DDL log recovery : begin
2020-08-06T14:25:02.936146Z 0 [Warning] [MY-010068] [Server] CA certificate /var/mysql/sslinfo/cacert.pem is self signed.
2020-08-06T14:25:02.963127Z 0 [Note] [MY-010253] [Server] IPv6 is available.
2020-08-06T14:25:03.109022Z 5 [Note] [MY-010051] [Server] Event Scheduler: scheduler thread started with id 5
```

传统格式的消息具有以下字段：

```
time thread [label] [err_code] [subsystem] msg
```

这`[`和`]`方括号字符是消息格式中的文字字符。它们并不表示字段是可选的。

这`标签`值对应于字符串形式的`优先`错误事件优先级字段。

这`[错误代码]`和`[子系统]`MySQL 8.0 中添加了字段。旧服务器生成的日志中缺少它们。日志解析器可以将这些字段视为消息文本的一部分，该消息文本仅存在于由最近足以包含它们的服务器编写的日志中。解析器必须处理`错误代码`部分`[错误代码]`指标作为字符串值，而不是数字，因为诸如`MY-012487`和`MY-010051`包含非数字字符。

##### 日志\_下沉\_json输出格式

JSON 格式的日志接收器将消息生成为包含键值对的 JSON 对象。例如：

```
{
  "prio": 3,
  "err_code": 10051,
  "source_line": 561,
  "source_file": "event_scheduler.cc",
  "function": "run",
  "msg": "Event Scheduler: scheduler thread started with id 5",
  "time": "2020-08-06T14:25:03.109022Z",
  "ts": 1596724012005,
  "thread": 5,
  "err_symbol": "ER_SCHEDULER_STARTED",
  "SQL_state": "HY000",
  "subsystem": "Server",
  "buffered": 1596723903109022,
  "label": "Note"
}
```

显示的消息已重新格式化以提高可读性。写入错误日志的事件每行显示一条消息。

[](<>)

这`ts`(timestamp) 键是在 MySQL 8.0.20 中添加的，对于 JSON 格式的日志接收器是唯一的。该值是一个整数，表示自纪元以来的毫秒数 (`'1970-01-01 00:00:00'`世界标准时间）。

这`ts`和`缓冲的`值是 Unix 时间戳值，可以使用转换`FROM_UNIXTIME()`和适当的除数：

```
mysql> SET time_zone = '+00:00';
mysql> SELECT FROM_UNIXTIME(1596724012005/1000.0);
+-------------------------------------+
| FROM_UNIXTIME(1596724012005/1000.0) |
+-------------------------------------+
| 2020-08-06 14:26:52.0050            |
+-------------------------------------+
mysql> SELECT FROM_UNIXTIME(1596723903109022/1000000.0);
+-------------------------------------------+
| FROM_UNIXTIME(1596723903109022/1000000.0) |
+-------------------------------------------+
| 2020-08-06 14:25:03.1090                  |
+-------------------------------------------+
```

##### 日志\_下沉\_syseventlog 输出格式

系统日志接收器生成符合本地平台上使用的系统日志格式的输出。

##### 早期启动日志输出格式

服务器在处理启动选项之前生成一些错误日志消息，因此在它知道错误日志设置之前，例如[`log_error_verbosity`](server-system-variables.html#sysvar_log_error_verbosity)和[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)系统变量值，并且在它知道要使用哪些日志组件之前。服务器处理在启动过程早期生成的错误日志消息，如下所示：

-   在 MySQL 8.0.14 之前，服务器生成具有默认时间戳、格式和详细级别的消息，并缓冲它们。在处理完启动选项并且知道错误日志配置后，服务器会刷新缓冲的消息。因为这些早期消息使用默认日志配置，所以它们可能与启动选项指定的不同。此外，早期消息不会刷新到默认值以外的日志接收器。例如，记录到 JSON 接收器不包括这些早期消息，因为它们不是 JSON 格式。

-   从 MySQL 8.0.14 开始，服务器缓冲日志事件而不是格式化的日志消息。这使其能够在已知设置后将配置设置追溯应用到这些事件，结果刷新的消息使用配置的设置，而不是默认设置。此外，消息会刷新到所有配置的接收器，而不仅仅是默认接收器。

    如果在知道日志配置之前发生致命错误并且服务器必须退出，则服务器使用日志记录默认设置缓冲消息的格式，这样它们就不会丢失。如果在处理启动选项之前没有发生致命错误但启动速度过慢，则服务器会使用日志记录默认值定期格式化和刷新缓冲消息，以免出现无响应。尽管此行为与 8.0.14 之前的行为相似，因为使用了默认值，但在发生异常情况时最好不要丢失消息。

##### 影响错误日志格式的系统变量

这[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)系统变量控制写入错误日志（以及一般查询日志和慢查询日志文件）的消息中时间戳的时区。服务器申请[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)在事件到达任何日志接收器之前出错；因此，它会影响所有接收器的错误消息输出。

允许[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)值是`世界标准时间`（默认）和`系统`（本地系统时区）。时间戳使用 ISO 8601 / RFC 3339 格式编写：`*`YYYY-MM-DD`*T*`hh:mm:ss.uuuuuu`*`加上一个尾值`Z`表示祖鲁时间 (UTC) 或`±hh:mm`（表示相对于 UTC 的本地系统时区调整的偏移量）。例如：

```
2020-08-07T15:02:00.832521Z            (UTC)
2020-08-07T10:02:00.832521-05:00       (SYSTEM)
```
