在 MySQL 8.4 中,错误日志使用在 第 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
存储引擎正在初始化,有时会由于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_json
替换log_sink_internal
。要立即加载和启用组件,并在后续重启时启用,请使用
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_json
替换log_sink_internal
。
要禁用日志组件,请将其从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
清除这些设置。重新启动服务器以卸载隐式加载的日志组件。
按照显式错误日志配置中的步骤重新实现您的配置。
在启动时,log_error_services
值中列出的日志组件会在 MySQL 服务器启动顺序的早期隐式加载。如果该日志组件之前已使用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 节,“错误日志表”.