在 MySQL 8.3 中,错误日志使用了在 第 7.5 节,“MySQL 组件” 中描述的 MySQL 组件架构。错误日志子系统由执行日志事件过滤和写入的组件,以及配置要加载和启用以实现所需日志结果的系统变量组成。
本节讨论如何加载和启用组件以进行错误日志记录。有关日志过滤器的说明,请参阅 第 7.4.2.4 节,“错误日志过滤类型”。有关 JSON 和系统日志 sink 的说明,请参阅 第 7.4.2.7 节,“JSON 格式错误日志记录” 和 第 7.4.2.8 节,“系统日志错误日志记录”。有关所有可用日志组件的详细信息,请参阅 第 7.5.3 节,“错误日志组件”。
基于组件的错误日志记录提供以下功能:
-
可以由过滤器组件过滤的日志事件,以影响写入的信息。
-
由 sink(writer)组件输出的日志事件。可以启用多个 sink 组件,以将错误日志输出写入多个目标。
-
内置的过滤器和 sink 组件,实现默认错误日志格式。
-
一个可加载的 sink,启用 JSON 格式日志记录。
-
一个可加载的 sink,启用系统日志记录。
-
控制哪些日志组件加载和启用,以及每个组件如何操作的系统变量。
错误日志配置在本节的以下主题中描述:
系统变量 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
sink 组件,都是内置组件。过滤器修改日志事件,以便在 log_error_services
值中命名的后续组件中看到的信息。sink 是日志事件的目标。通常,sink 将日志事件处理为具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。
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'
要纠正这个问题,请在值的末尾添加一个sink:
mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
-
在
log_error_services
中命名的组件顺序很重要,特别是在过滤器和sink之间的相对顺序方面。考虑以下log_error_services
值:log_filter_internal; log_sink_1; log_sink_2
在这种情况下,日志事件首先传递给内置过滤器,然后传递给第一个sink,然后传递给第二个sink。两个sink都接收到过滤后的日志事件。
将其与以下
log_error_services
值进行比较:log_sink_1; log_filter_internal; log_sink_2
在这种情况下,日志事件首先传递给第一个sink,然后传递给内置过滤器,然后传递给第二个sink。第一个sink接收未过滤的事件,第二个sink接收过滤后的事件。你可能会以这种方式配置错误日志,以便在一个日志中包含所有日志事件的消息,而在另一个日志中包含只有某些日志事件的消息。
错误日志配置涉及加载和启用错误日志组件,并执行组件特定的配置。
有两种错误日志配置方法:隐式和显式。建议选择一种配置方法并专门使用它。使用这两种方法可能会在启动时出现警告。有关更多信息,请参阅故障排除配置问题。
-
隐式错误日志配置
这种配置方法加载和启用
log_error_services
变量定义的日志组件。未加载的组件将在启动时隐式加载,在InnoDB
存储引擎完全可用之前。这一种配置方法具有以下优点:-
日志组件在启动序列中较早加载,在
InnoDB
存储引擎之前,使日志信息更早可用。 -
它避免了启动期间可能的日志信息丢失。
-
使用
INSTALL COMPONENT
安装错误日志组件不是必需的,从而简化了错误日志配置。
要使用这种方法,请参阅隐式错误日志配置。
-
-
显式错误日志配置
Note这种配置方法是为了向后兼容性。隐式配置方法是推荐的。
此配置方法需要使用
INSTALL COMPONENT
加载错误日志组件,然后配置log_error_services
以启用日志组件。INSTALL COMPONENT
将组件添加到mysql.component
表(一个InnoDB
表)中,并且在启动时从该表中读取要加载的组件,该表仅在InnoDB
初始化后可访问。在启动序列中,记录的信息会被缓冲,而
InnoDB
存储引擎的初始化可能会被恢复和数据字典升级等操作所延迟。要使用此方法,请参阅 显式错误日志配置。
本过程描述了如何使用 log_error_services
隐式加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅 错误日志配置方法。
要隐式加载和启用错误日志组件:
-
在
log_error_services
值中列出错误日志组件。要在服务器启动时加载和启用错误日志组件,设置
log_error_services
在选项文件中。以下示例配置使用 JSON 日志 sink (log_sink_json
) 除了内置日志过滤器和 sink (log_filter_internal
,log_sink_internal
)。[mysqld] log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
Note要使用 JSON 日志 sink (
log_sink_syseventlog
) 而不是默认 sink (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
设置这些变量。Important在隐式配置中,首先设置
log_error_services
以加载组件并公开其系统变量,然后设置组件系统变量。无论是命令行、选项文件还是使用SET PERSIST
,都需要遵循这种配置顺序。
要禁用日志组件,从 log_error_services
值中删除它。同时删除您定义的任何关联组件变量设置。
使用 log_error_services
隐式加载日志组件不会影响 mysql.component
表。它既不将组件添加到 mysql.component
表中,也不删除使用 INSTALL COMPONENT
安装的组件。
该过程描述了如何使用 INSTALL COMPONENT
明确加载错误日志组件,然后使用 log_error_services
启用它们。有关错误日志配置方法的讨论,请参阅 错误日志配置方法。
要明确加载和启用错误日志组件:
-
使用
INSTALL COMPONENT
加载组件(除非它是内置的或已经加载的)。例如,要加载 JSON 日志 sink,发出以下语句: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
值中列出组件来启用它。Important使用
INSTALL COMPONENT
明确加载日志组件时,不要在选项文件中持久化或设置log_error_services
,这将隐式加载日志组件在启动时。相反,使用SET GLOBAL
语句在运行时启用日志组件。以下示例配置了使用 JSON 日志 sink (
log_sink_json
) 除了内置的日志过滤器和 sink (log_filter_internal
,log_sink_internal
)。SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
Note要使用 JSON 日志 sink (
log_sink_syseventlog
) 而不是默认的 sink (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 日志 sink,现在卸载它,如下所示: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 日志 sink 组件,那么该组件将在启动时隐式加载。尝试显式加载同一组件将返回该错误:
mysql> INSTALL COMPONENT 'file://component_log_sink_json';
ERROR 3529 (HY000): Cannot load component from specified URN: 'file://component_log_sink_json'.
可以配置多个日志 sink,从而启用将输出发送到多个目标。要启用 JSON 日志 sink 除了(而不是)默认 sink,请将 log_error_services
值设置如下:
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
要恢复使用默认 sink 并卸载系统日志 sink,请执行以下语句:
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_json';
如果启用了日志组件,包括提供性能模式支持的 sink,那么写入错误日志的事件也将写入性能模式 error_log
表中。这使得可以使用 SQL 查询检查错误日志内容。目前,传统格式的 log_sink_internal
和 JSON 格式的 log_sink_json
sink 支持该功能。请参阅 第 29.12.22.2 节,“The error_log 表”。