在 MySQL 9.0 中,错误日志记录使用在 第 7.5 节,“MySQL 组件” 中描述的 MySQL 组件体系结构。错误日志子系统由执行日志事件过滤和写入的组件组成,以及配置要加载和启用哪些组件以实现所需日志记录结果的系统变量。
本节讨论如何加载和启用用于错误日志记录的组件。有关特定于日志过滤器的说明,请参见 第 7.4.2.4 节,“错误日志过滤类型”。有关特定于 JSON 和系统日志接收器的说明,请参见 第 7.4.2.7 节,“JSON 格式的错误日志记录” 和 第 7.4.2.8 节,“将错误日志记录到系统日志”。有关所有可用日志组件的更多详细信息,请参见 第 7.5.3 节,“错误日志组件”.
基于组件的错误日志记录提供了以下功能
可以被过滤器组件过滤的日志事件,以影响可用于写入的信息。
由接收器(写入器)组件输出的日志事件。可以启用多个接收器组件,以便将错误日志输出写入多个目标。
实现默认错误日志格式的内置过滤器和接收器组件。
一个可加载的接收器,它允许以 JSON 格式进行日志记录。
一个可加载的接收器,它允许将日志记录到系统日志。
控制要加载和启用哪些日志组件以及每个组件如何操作的系统变量。
本节中的以下主题描述了错误日志配置
log_error_services
系统变量控制要加载哪些可加载日志组件,以及要启用哪些日志组件用于错误日志记录。默认情况下,log_error_services
具有此处显示的值
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
该值表示日志事件首先通过 log_filter_internal
过滤器组件,然后通过 log_sink_internal
接收器组件,这两个组件都是内置组件。过滤器修改 log_error_services
值中后面命名的组件看到的日志事件。接收器是日志事件的目标。通常,接收器将日志事件处理成具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。
log_filter_internal
和 log_sink_internal
的组合实现了默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量的影响
输出目标由
--log-error
选项(以及在 Windows 上的--pid-file
和--console
)决定。这些选项决定是将错误消息写入控制台还是文件,如果写入文件,则确定错误日志文件名。参见 第 7.4.2.2 节,“默认错误日志目标配置”.log_error_verbosity
和log_error_suppression_list
系统变量影响log_filter_internal
允许或禁止哪些类型的日志事件。参见 第 7.4.2.5 节,“基于优先级的错误日志过滤 (log_filter_internal)”.
在配置 log_error_services
时,请注意以下特征
日志组件列表可以用分号或逗号分隔,可选地后跟空格。给定设置不能同时使用分号和逗号分隔符。组件顺序很重要,因为服务器按列表顺序执行组件。
在
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
在这种情况下,日志事件将传递到第一个接收器,然后传递到内置过滤器,最后传递到第二个接收器。第一个接收器接收未过滤的事件。第二个接收器接收已过滤的事件。如果想要一个包含所有日志事件消息的日志,另一个包含仅针对日志事件子集的消息的日志,则可以这样配置错误日志。
错误日志配置涉及根据需要加载和启用错误日志组件,以及执行特定于组件的配置。
存在两种错误日志配置方法:隐式 和 显式。建议选择一种配置方法并专门使用。使用这两种方法可能会导致启动时出现警告。有关更多信息,请参阅 排查配置问题。
隐式错误日志配置
此配置方法加载并启用由
log_error_services
变量定义的日志组件。尚未加载的可加载组件将在启动时隐式加载,早于InnoDB
存储引擎完全可用。这种配置方法具有以下优势日志组件在启动序列的早期加载,早于
InnoDB
存储引擎,使记录的信息尽早可用。如果在启动过程中发生故障,它可以避免缓冲的日志信息丢失。
无需使用
INSTALL COMPONENT
安装错误日志组件,简化了错误日志配置。
要使用此方法,请参阅 隐式错误日志配置。
显式错误日志配置
注意此配置方法支持向后兼容。建议使用隐式配置方法。
此配置方法要求使用
INSTALL COMPONENT
加载错误日志组件,然后配置log_error_services
以启用日志组件。INSTALL COMPONENT
将组件添加到mysql.component
表(一个InnoDB
表),并且将在启动时加载的组件将从该表中读取,该表仅在InnoDB
初始化后才能访问。在启动序列期间,日志信息将被缓冲,直到
InnoDB
存储引擎初始化,这有时会被启动序列期间发生的恢复和数据字典升级等操作延长。要使用此方法,请参阅 显式错误日志配置。
本过程介绍如何使用 log_error_services
隐式加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅 错误日志配置方法。
要隐式加载和启用错误日志组件
在
log_error_services
值中列出错误日志组件。要在服务器启动时加载和启用错误日志组件,请在选项文件中设置
log_error_services
。以下示例配置了使用 JSON 日志接收器 (log_sink_json
) 以及内置日志过滤器和接收器 (log_filter_internal
,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_internal
替换为log_sink_json
。要立即加载和启用组件,并在后续重启时加载和启用,请使用
SET PERSIST
设置log_error_services
SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
如果错误日志组件公开任何必须设置才能成功初始化组件的系统变量,请为这些变量分配适当的值。您可以在选项文件中或使用
SET PERSIST
设置这些变量。重要在实施隐式配置时,首先设置
log_error_services
以加载组件并公开其系统变量,然后在之后设置组件系统变量。无论是在命令行、选项文件中还是使用SET PERSIST
执行变量赋值,都需要这种配置顺序。
要禁用日志组件,请将其从 log_error_services
值中删除。还要删除您定义的任何相关组件变量设置。
使用 log_error_services
隐式加载日志组件不会影响 mysql.component
表。它不会将组件添加到 mysql.component
表中,也不会从 mysql.component
表中删除先前使用 INSTALL COMPONENT
安装的组件。
本过程介绍如何通过使用 INSTALL COMPONENT
加载组件,然后使用 log_error_services
启用组件来显式加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅 错误日志配置方法。
要显式加载和启用错误日志组件
使用
INSTALL COMPONENT
加载组件(除非它是内置的或已加载)。例如,要加载 JSON 日志接收器,请发出以下语句INSTALL COMPONENT 'file://component_log_sink_json';
使用
INSTALL COMPONENT
加载组件将在mysql.component
系统表中注册它,以便服务器在InnoDB
初始化后自动加载它,以供后续启动使用。使用
INSTALL COMPONENT
加载日志组件时使用的 URN 是组件名称,前缀为file://component_
。例如,对于log_sink_json
组件,相应的 URN 为file://component_log_sink_json
。有关错误日志组件 URN,请参阅 第 7.5.3 节“错误日志组件”。如果错误日志组件公开任何必须设置才能成功初始化组件的系统变量,请为这些变量分配适当的值。您可以在选项文件中或使用
SET PERSIST
设置这些变量。在
log_error_services
值中列出组件以启用它。重要在使用
INSTALL COMPONENT
显式加载日志组件时,请勿在选项文件中持久化或设置log_error_services
,因为这会隐式地在启动时加载日志组件。相反,请使用SET GLOBAL
语句在运行时启用日志组件。以下示例配置了使用 JSON 日志接收器 (
log_sink_json
) 以及内置日志过滤器和接收器 (log_filter_internal
,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_internal
替换为log_sink_json
。
要禁用日志组件,请将其从 log_error_services
值中删除。然后,如果组件是可加载的,并且您还想卸载它,请使用 UNINSTALL COMPONENT
。还要删除您定义的任何相关组件变量设置。
尝试使用 UNINSTALL COMPONENT
卸载仍包含在 log_error_services
值中的可加载组件会导致错误。
如果您之前已使用 INSTALL COMPONENT
显式加载了错误日志组件,并且想要切换到隐式配置,如 隐式错误日志配置 中所述,建议执行以下步骤
将
log_error_services
设置回其默认配置。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
使用
UNINSTALL COMPONENT
卸载之前安装的任何可加载日志组件。例如,如果您之前安装了 JSON 日志接收器,请按照以下步骤卸载它UNINSTALL COMPONENT 'file://component_log_sink_json';
删除与卸载的组件关联的任何组件变量设置。例如,如果组件变量是在选项文件中设置的,请从选项文件中删除设置。如果组件变量是使用
SET PERSIST
设置的,请使用RESET PERSIST
清除设置。按照 隐式错误日志配置 中的步骤重新实施您的配置。
如果您需要从隐式配置还原到显式配置,请执行以下步骤
将
log_error_services
设置回其默认配置以卸载隐式加载的日志组件。SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
删除与卸载的组件关联的任何组件变量设置。例如,如果组件变量是在选项文件中设置的,请从选项文件中删除设置。如果组件变量是使用
SET PERSIST
设置的,请使用RESET PERSIST
清除设置。重启服务器以卸载隐式加载的日志组件。
按照 显式错误日志配置 中的步骤重新实施您的配置。
在 MySQL 服务器启动序列的早期,启动时在 log_error_services
值中列出的日志组件会隐式加载。如果日志组件先前使用 INSTALL COMPONENT
加载过,服务器将在启动序列的后期尝试再次加载该组件,这会产生警告信息 无法从指定的 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
接收器支持此功能。请参见 第 29.12.22.2 节,“error_log 表”。