#### 5.4.2.1 错误日志配置

在 MySQL 8.0 中，错误日志记录使用 MySQL 组件架构，描述于[第 5.5 节，“MySQL 组件”](components.html).错误日志子系统包含执行日志事件过滤和写入的组件，以及配置启用哪些组件以实现所需日志记录结果的系统变量。

本节讨论如何选择用于错误记录的组件。有关特定于日志过滤器的说明，请参阅[第 5.4.2.4 节，“错误日志过滤的类型”](error-log-filtering.html).有关特定于 JSON 和系统日志接收器的说明，请参阅[第 5.4.2.7 节，“以 JSON 格式记录错误”](error-log-json.html)， 和[第 5.4.2.8 节，“错误记录到系统日志”](error-log-syslog.html).有关所有可用日志组件的更多详细信息，请参阅[第 5.5.3 节，“错误日志组件”](error-log-components.html).

基于组件的错误日志记录提供以下功能：

-   日志事件可以通过过滤器组件过滤，以影响可写入的信息。

-   日志事件由接收器（写入器）组件输出。可以启用多个接收器组件，以将错误日志输出写入多个目的地。

-   内置过滤器和接收器组件结合起来实现默认的错误日志格式。

-   可加载接收器启用 JSON 格式的日志记录。

-   可加载的接收器可以记录到系统日志。

-   系统变量控制要启用的日志组件以及每个组件的操作方式。

    这[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)系统变量控制为错误记录启用哪些日志组件。该变量可能包含一个包含 0、1 或许多元素的列表。在后一种情况下，元素可以用分号或（从 MySQL 8.0.12 开始）逗号分隔，可选地后跟空格。给定设置不能同时使用分号和逗号分隔符。组件顺序很重要，因为服务器按列出的顺序执行组件。

    默认，[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)有这个值：


```
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services            |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
```

该值表示日志事件首先通过`log_filter_internal`过滤组件，然后通过`日志\水槽\内部`水槽组件，两者都是内置的。过滤器会修改文件中稍后命名的组件看到的日志事件[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值接收器是日志事件的目的地。通常，接收器将日志事件处理为具有特定格式的日志消息，并将这些消息写入其相关输出，例如文件或系统日志。

笔记

最后一个组件[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)值不能是筛选器。这是一个错误，因为它对事件所做的任何更改都不会影响输出：

```
mysql> SET GLOBAL log_error_services = 'log_filter_internal';
ERROR 1231 (42000): Variable 'log_error_services' can't be set to the value
of 'log_filter_internal'
```

要更正此问题，请在值的末尾包含一个接收器：

```
mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
Query OK, 0 rows affected (0.00 sec)
```

结合`日志过滤器内部`和`日志\水槽\内部`实现默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量的影响：

-   输出目的地由[`--日志错误`](server-options.html#option_mysqld_log-error)选项（在Windows上，[`--pid文件`](server-system-variables.html#sysvar_pid_file)和[`--安慰`](server-options.html#option_mysqld_console))。它们确定是将错误消息写入控制台还是文件，如果写入文件，则确定错误日志文件名。看见[第5.4.2.2节，“默认错误日志目标配置”](error-log-destination-configuration.html).

-   这个[`日志错误详细`](server-system-variables.html#sysvar_log_error_verbosity)和[`日志错误抑制列表`](server-system-variables.html#sysvar_log_error_suppression_list)系统变量会影响日志事件的类型`日志过滤器内部`允许或压制。看见[第5.4.2.5节，“基于优先级的错误日志过滤（日志\_滤器\_内部“](error-log-priority-based-filtering.html).

    要更改用于错误日志记录的日志组件集，请根据需要加载组件，执行任何特定于组件的配置，并修改[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值添加或删除日志组件受以下限制：

-   要将日志组件添加到已启用组件列表中，请执行以下操作：

    -   使用以下命令加载组件：[`安装组件`](install-component.html)（除非它内置或已加载）。

    -   如果组件暴露任何必须设置的系统变量以使组件初始化成功，请为这些变量分配适当的值。

    -   通过在列表中列出组件来启用该组件[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值

-   对于允许在[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值，它必须是已知的。如果组件是内置的，或者它是可加载的，并且已使用[`安装组件`](install-component.html).试图在服务器启动时命名未知组件的原因[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)设置为其默认值。在运行时尝试命名未知组件会产生错误，并且[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值保持不变。

-   要禁用日志组件，请将其从[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值然后，如果组件是可加载的，并且您也希望卸载它，请使用[`卸载组件`](uninstall-component.html).

    尝试使用[`卸载组件`](uninstall-component.html)卸载仍在中命名的可加载组件[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)值会产生错误。

    例如，使用系统日志接收器(`日志\接收器\系统事件日志`)而不是默认的接收器(`日志\水槽\内部`)，首先加载接收器组件，然后修改[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值：


```
INSTALL COMPONENT 'file://component_log_sink_syseventlog';
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_syseventlog';
```

笔记

用于加载日志组件的URN[`安装组件`](install-component.html)组件名称的前缀是`file://component_`.例如`日志\接收器\系统事件日志`组件，相应的URN是`file://component_log_sink_syseventlog`.

可以配置多个日志接收器，这样可以将输出发送到多个目标。要启用默认接收器之外的系统日志接收器（而不是），请设置[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值观如下：

```
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_syseventlog';
```

要恢复为仅使用默认接收器并卸载系统日志接收器，请执行以下语句：

```
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_syseventlog';
```

要将日志组件配置为在每次服务器启动时启用，请使用以下步骤：

1.  如果组件是可加载的，请在运行时使用[`安装组件`](install-component.html).加载组件会将其注册到`mysql。组成部分`系统表，以便服务器为后续启动自动加载。

2.  设定[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)值，以包括组件名称。在服务器中或`我的cnf`文件，或使用[`设定持续时间`](set-variable.html)，为正在运行的MySQL实例设置一个值，并保存该值以用于后续服务器重启；看见[第13.7.6.1节，“设置变量赋值语法”](set-variable.html).在中设置的值`我的cnf`在下次重新启动时生效。使用[`设定持续时间`](set-variable.html)立即生效，并用于随后的重新启动。

    假设您希望为每次服务器启动配置JSON日志接收器的使用(`log_sink_json`)除了内置的日志过滤器和接收器(`日志过滤器内部`, `日志\水槽\内部`)。如果未加载JSON接收器，请首先加载它：


```
INSTALL COMPONENT 'file://component_log_sink_json';
```

然后设定[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)在服务器启动时生效。你可以把它放进去`我的cnf`:

```
[mysqld]
log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
```

或者你可以使用[`设定持续时间`](set-variable.html):

```
SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
```

中命名的组件的顺序[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)这一点非常重要，尤其是在过滤器和水槽的相对顺序方面。考虑这个[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值：

```
log_filter_internal; log_sink_1; log_sink_2
```

在这种情况下，日志事件会传递到内置过滤器，然后传递到第一个接收器，然后再传递到第二个接收器。两个接收器都接收过滤后的日志事件。

把这个和这个比较一下[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值：

```
log_sink_1; log_filter_internal; log_sink_2
```

在这种情况下，日志事件会传递到第一个接收器，然后传递到内置过滤器，然后再传递到第二个接收器。第一个接收器接收未过滤的事件。第二个接收器接收过滤后的事件。如果希望一个日志包含所有日志事件的消息，另一个日志仅包含日志事件子集的消息，则可以通过这种方式配置错误日志记录。

笔记

如果启用的日志组件包括提供性能模式支持的接收器，则写入错误日志的事件也会写入性能模式[`错误日志`](performance-schema-error-log-table.html)桌子这允许使用SQL查询检查错误日志内容。目前，传统的格式`日志\水槽\内部`和JSON格式`log_sink_json`接收器支持这种功能。看见[第27.12.21.1节，“错误\_日志表“](performance-schema-error-log-table.html).
