在 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_internal
filter 组件,然后通过log_sink_internal
sink 组件,这两个组件都是内置组件。过滤器修改
log_error_services
值中稍后命名的组件看到的日志事件。接收器是日志事件的目的地。通常,接收器将日志事件处理成具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。
log_filter_internal
和
的组合log_sink_internal
实现了默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量的影响:
输出目标由
--log-error
选项确定(and,在 Windows 上,--pid-file
and--console
)。这些确定是否将错误消息写入控制台或文件,如果写入文件,则为错误日志文件名。请参阅 第 5.4.2.2 节,“默认错误日志目标配置”。和系统变量会影响允许或抑制
log_error_verbosity
哪些log_error_suppression_list
类型的日志事件 。log_filter_internal
请参阅 第 5.4.2.5 节,“基于优先级的错误日志过滤 (log_filter_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
。有关错误日志配置方法的讨论,请参阅
错误日志配置方法。
要隐式加载和启用错误日志记录组件:
列出
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_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
.重要的实现隐式配置时,
log_error_services
先设置加载一个组件并暴露其系统变量,然后再设置组件系统变量。无论变量赋值是在命令行、选项文件中还是使用SET PERSIST
.
要禁用日志组件,请将其从
log_error_services
值中删除。同时删除您已定义的所有相关组件变量设置。
使用隐式加载日志组件
对表log_error_services
没有影响。mysql.component
它不会将组件添加到
表中,也不会从
表mysql.component
中删除以前安装的组件
。
INSTALL COMPONENT
mysql.component
此过程描述了如何通过使用加载组件
INSTALL COMPONENT
然后启用使用来
显式加载和启用错误日志记录组件log_error_services
。有关错误日志配置方法的讨论,请参阅
错误日志配置方法。
要显式加载和启用错误日志记录组件:
加载组件使用
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 节,“错误日志组件”。如果错误日志组件公开了任何必须为组件初始化成功设置的系统变量,请为这些变量分配适当的值。您可以在选项文件中或使用
SET PERSIST
.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_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 8.0.30 开始,启动时值中列出的日志组件在
log_error_services
MySQL 服务器启动序列的早期隐式加载。如果日志组件之前是使用 加载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 表”。