Documentation Home

5.4.2.1 错误日志配置

在 MySQL 8.0 中,错误日志记录使用 第 5.5 节“MySQL 组件”中描述的 MySQL 组件架构。错误日志子系统由执行日志事件过滤和写入的组件以及配置要加载和启用哪些组件以实现所需日志记录结果的系统变量组成。

本节讨论如何加载和启用组件以进行错误记录。有关特定于日志过滤器的说明,请参阅 第 5.4.2.4 节,“错误日志过滤的类型”。有关特定于 JSON 和系统日志接收器的说明,请参阅 第 5.4.2.7 节,“以 JSON 格式记录错误”第 5.4.2.8 节,“将错误记录到系统日志”。有关所有可用日志组件的更多详细信息,请参阅 第 5.5.3 节,“错误日志组件”

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

  • 可以被过滤器组件过滤以影响可用于写入的信息的日志事件。

  • 接收器(编写器)组件输出的日志事件。可以启用多个接收器组件,以将错误日志输出写入多个目的地。

  • 实现默认错误日志格式的内置过滤器和接收器组件。

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

  • 启用记录到系统日志的可加载接收器。

  • 控制加载和启用哪些日志组件以及每个组件如何运行的系统变量。

本节的以下主题描述了错误日志配置:

默认错误日志配置

系统变量控制要加载的log_error_services可加载日志组件(从 MySQL 8.0.30 开始)以及为错误日志记录启用的日志组件。默认情况下, log_error_services具有此值:

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

该值表示日志事件首先通过 log_filter_internalfilter 组件,然后通过log_sink_internalsink 组件,这两个组件都是内置组件。过滤器修改 log_error_services值中稍后命名的组件看到的日志事件。接收器是日志事件的目的地。通常,接收器将日志事件处理成具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。

log_filter_internal和 的组合log_sink_internal实现了默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量的影响:

配置时 log_error_services,请注意以下特征:

  • 日志组件列表可以用分号或(从 MySQL 8.0.12 开始)逗号分隔,可选地后跟空格。给定的设置不能同时使用分号和逗号分隔符。组件顺序很重要,因为服务器按列出的顺序执行组件。

  • 值中的最后一个组件 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';
  • 命名的组件的顺序 log_error_services很重要,特别是相对于过滤器和接收器的相对顺序。考虑这个 log_error_services值:

    log_filter_internal; log_sink_1; log_sink_2

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

    将其与此 log_error_services值进行比较:

    log_sink_1; log_filter_internal; log_sink_2

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

错误日志配置方法

错误日志配置包括根据需要加载和启用错误日志组件以及执行特定于组件的配置。

错误日志配置方式有 隐式显式两种。建议选择一种配置方式,独占使用。使用这两种方法可能会导致在启动时出现警告。有关详细信息,请参阅 排除配置问题

  • 隐式错误日志配置 (MySQL 8.0.30引入)

    此配置方法加载并启用 log_error_services 变量定义的日志组件。InnoDB在存储引擎完全可用之前,尚未加载的可加载组件会在启动时隐式加载 。这种配置方式有以下优点:

    • 日志组件在启动序列的早期加载,在InnoDB存储引擎之前,使记录的信息更快可用。

    • 如果在启动期间发生故障,它可以避免丢失缓冲的日志信息。

    • INSTALL COMPONENT不需要 安装错误日志组件 ,简化错误日志配置。

    要使用此方法,请参阅 隐式错误日志配置

  • 显式错误日志配置

    笔记

    支持此配置方法是为了向后兼容。推荐使用MySQL 8.0.30引入的隐式配置方式。

    这种配置方式需要使用加载错误日志组件INSTALL COMPONENT,然后配置 log_error_services启用日志组件。INSTALL COMPONENT将组件添加到 mysql.component表(一张 InnoDB表)中,启动时要加载的组件就是从这张表中读取的,只有InnoDB初始化后才能访问。

    当存储引擎被初始化时,记录的信息在启动序列期间被缓冲InnoDB,这有时会因InnoDB启动序列期间发生的恢复和数据字典升级等操作而延长。

    要使用此方法,请参阅 显式错误日志配置

隐式错误日志配置

此过程描述如何使用隐式加载和启用错误日志记录组件 log_error_services。有关错误日志配置方法的讨论,请参阅 错误日志配置方法

要隐式加载和启用错误日志记录组件:

  1. 列出 log_error_services值中的错误日志组件。

    要在服务器启动时加载和启用错误日志组件,请 log_error_services在选项文件中设置。log_sink_json除了内置的日志过滤器和接收器 ( log_filter_internal, ) 之外,以下示例还配置了 JSON 日志接收器 ( ) 的使用log_sink_internal

    [mysqld]
    log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
    笔记

    要使用 JSON 日志接收器 ( log_sink_syseventlog) 而不是默认接收器 ( log_sink_internal),您将替换log_sink_internallog_sink_json

    要立即加载和启用该组件以及随后的重新启动,请 log_error_services使用 SET PERSIST

    SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
  2. 如果错误日志组件公开了任何必须为组件初始化成功设置的系统变量,请为这些变量分配适当的值。您可以在选项文件中或使用 SET PERSIST.

    重要的

    实现隐式配置时, log_error_services 先设置加载一个组件并暴露其系统变量,然后再设置组件系统变量。无论变量赋值是在命令行、选项文件中还是使用 SET PERSIST.

要禁用日志组件,请将其从 log_error_services值中删除。同时删除您已定义的所有相关组件变量设置。

笔记

使用隐式加载日志组件 对表log_error_services没有影响。mysql.component它不会将组件添加到 表中,也不会从 表mysql.component中删除以前安装的组件 。 INSTALL COMPONENTmysql.component

显式错误日志配置

此过程描述了如何通过使用加载组件 INSTALL COMPONENT然后启用使用来 显式加载和启用错误日志记录组件log_error_services。有关错误日志配置方法的讨论,请参阅 错误日志配置方法

要显式加载和启用错误日志记录组件:

  1. 加载组件使用INSTALL COMPONENT(除非它是内置的或已经加载)。例如,要加载 JSON 日志接收器,请发出以下语句:

    INSTALL COMPONENT 'file://component_log_sink_json';

    加载组件使用INSTALL COMPONENT将其注册在 mysql.component系统表中,以便服务器在InnoDB初始化后自动加载它以供后续启动。

    加载日志组件时使用的 URN INSTALL COMPONENT是前缀为 的组件名称 file://component_。例如,对于 log_sink_json组件,对应的 URN 是 file://component_log_sink_json. 对于错误日志组件 URN,请参阅 第 5.5.3 节,“错误日志组件”

  2. 如果错误日志组件公开了任何必须为组件初始化成功设置的系统变量,请为这些变量分配适当的值。您可以在选项文件中或使用 SET PERSIST.

  3. log_error_services通过在值 中列出来启用该组件 。

    重要的

    从 MySQL 8.0.30 开始,当使用 显式加载日志组件时INSTALL COMPONENT,不要 log_error_services在选项文件中持久化或设置,这会在启动时隐式加载日志组件。相反,使用SET GLOBAL语句在运行时启用日志组件。

    log_sink_json除了内置的日志过滤器和接收器 ( log_filter_internal, ) 之外, 以下示例还配置了 JSON 日志接收器 ( ) 的使用log_sink_internal

    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
    笔记

    要使用 JSON 日志接收器 ( log_sink_syseventlog) 而不是默认接收器 ( log_sink_internal),您将替换log_sink_internallog_sink_json

要禁用日志组件,请将其从 log_error_services值中删除。然后,如果该组件是可加载的并且您还想卸载它,请使用UNINSTALL COMPONENT. 同时删除您已定义的所有相关组件变量设置。

尝试使用UNINSTALL COMPONENT卸载仍然在 log_error_services值中命名的可加载组件会产生错误。

更改错误日志配置方法

如果您之前使用显式加载错误日志组件INSTALL COMPONENT并希望切换到隐式配置,如 隐式错误日志配置中所述,建议执行以下步骤:

  1. 设置log_error_services 回其默认配置。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 用于UNINSTALL COMPONENT卸载您之前安装的任何可加载日志记录组件。例如,如果您之前安装了 JSON 日志接收器,请按如下所示将其卸载:

    UNINSTALL COMPONENT 'file://component_log_sink_json';
  3. 删除已卸载组件的所有组件变量设置。例如,如果在选项文件中设置了组件变量,则从选项文件中删除设置。如果使用 设置组件变量 SET PERSIST,请使用 RESET PERSIST清除设置。

  4. 按照 隐式错误日志配置中的步骤重新实现您的配置。

如果您需要从隐式配置恢复为显式配置,请执行以下步骤:

  1. 设置log_error_services 回其默认配置以卸载隐式加载的日志组件。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 删除与已卸载组件关联的任何组件变量设置。例如,如果在选项文件中设置了组件变量,则从选项文件中删除设置。如果使用 设置组件变量SET PERSIST,请使用 RESET PERSIST清除设置。

  3. 重新启动服务器以卸载隐式加载的日志组件。

  4. 按照 显式错误日志配置中的步骤重新实施您的配置。

配置问题故障排除

从 MySQL 8.0.30 开始,启动时值中列出的日志组件在 log_error_servicesMySQL 服务器启动序列的早期隐式加载。如果日志组件之前是使用 加载INSTALL COMPONENT的,则服务器稍后会尝试在启动序列中再次加载该组件,这会产生以下警告:

Cannot load component from specified URN: 'file://component_component_name'

error_log 您可以在错误日志中或通过使用以下查询查询 性能模式表来检查此警告:

SELECT error_code, data
  FROM performance_schema.error_log
 WHERE data LIKE "%'file://component_%"
   AND error_code="MY-013129" AND data LIKE "%MY-003529%";

为防止此警告,请按照 更改错误日志配置方法中的说明调整错误日志配置。应该使用隐式或显式错误日志配置,但不能同时使用两者。

尝试显式加载在启动时隐式加载的组件时会发生类似的错误。例如,如果log_error_services列出 JSON 日志接收器组件,则该组件会在启动时隐式加载。稍后尝试显式加载同一组件会返回此错误:

mysql> INSTALL COMPONENT 'file://component_log_sink_json';
ERROR 3529 (HY000): Cannot load component from specified URN: 'file://component_log_sink_json'.
配置多个日志接收器

可以配置多个日志接收器,从而可以将输出发送到多个目的地。除了(而不是代替)默认接收器之外,要启用 JSON 日志接收器,请 log_error_services像这样设置值:

SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';

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

SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_json';
日志接收器性能模式支持

如果启用的日志组件包含提供性能模式支持的接收器,则写入错误日志的事件也会写入性能模式 error_log表。这允许使用 SQL 查询检查错误日志内容。目前,传统格式log_sink_internal和 JSON 格式的接收器都log_sink_json支持此功能。请参阅 第 27.12.21.1 节,“error_log 表”