7.4.2.1 错误日志配置
MySQL 8.4 中,错误日志使用 MySQL 组件架构,如第7.5节,“MySQL 组件”所述。错误日志子系统由执行日志事件过滤和写入的组件组成,以及一个系统变量,配置要加载和启用的组件,以实现期望的日志结果。
本节讨论如何加载和启用错误日志组件。关于日志过滤器的说明,请见第7.4.2.4节,“错误日志 filtering 类型”。关于 JSON 和系统日志沉点的说明,请见第7.4.2.7节,“JSON 格式错误日志”,和第7.4.2.8节,“系统日志错误日志”。关于所有可用日志组件的详细信息,请见第7.5.3节,“错误日志组件”。
基于组件的错误日志提供以下功能:
-
可以根据过滤组件来过滤日志事件,以影响可写入的信息。
-
由沉点(writer)组件输出的日志事件。可以启用多个沉点组件,向多个目的地写入错误日志输出。
-
内置过滤和沉点组件,实现默认错误日志格式。
-
可加载的沉点,启用 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
时,注意以下特点:
-
日志组件列表可以用分号或逗号分隔,optional后跟空格。给定的设置不能同时使用分号和逗号分隔。组件顺序很重要,因为服务器按列表顺序执行组件。
-
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接收过滤后的事件。你可能会这样配置错误日志,如果你想有一个包含所有日志事件的日志,还有一个只包含某些日志事件的日志。
错误日志配置方法
错误日志配置涉及加载和启用错误日志组件,并执行组件特定的配置。
有两个错误日志配置方法,隐式和显式。建议选择一个配置方法,并且独自使用。同时使用这两个方法可能会在启动时出现警告。更多信息,请参见Troubleshooting Configuration Issues。
-
隐式错误日志配置
这个配置方法加载和启用由
log_error_services
变量定义的日志组件。可加载的组件在启动前自动加载,直到InnoDB
存储引擎完全可用。这配置方法具有以下优点:-
日志组件在启动序列中早期加载,使logged信息更快可用。
-
避免了在启动过程中出现故障时的缓冲日志信息丢失。
-
使用
INSTALL COMPONENT
安装日志组件不再需要,简化了错误日志配置。
要使用这个方法,请参见Implicit Error Log Configuration。
-
-
显式错误日志配置
Note这个配置方法是为了向后兼容的。隐式配置方法推荐使用。
这个配置方法需要使用
INSTALL COMPONENT
加载错误日志组件,然后配置log_error_services
来启用日志组件。INSTALL COMPONENT
将组件添加到mysql.component
表(一个InnoDB
表),并从这个表中读取要在启动时加载的组件,这个表直到InnoDB
初始化后才能访问。在启动序列中,logged信息会被缓冲,因为
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'
Note要使用JSON日志汇聚器(
log_sink_syseventlog
)而不是默认汇聚器(log_sink_internal
),将替换log_sink_internal
为log_sink_json
。使用
log_error_services
来加载和启用组件,并在后续重启时保持设置:SET PERSIST
: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
表的影响,不会将组件添加到该表中,也不会从使用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
值中启用组件。Important使用
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';
Note要使用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
'。
您可以在错误日志中查找这个警告,或者使用以下查询来查询性能chemaerror_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节,“The error_log Table”.