JeeStudy 发表于 2020-4-21 15:39:42

MySQL8.0大师之路:第11章:MySQL服务器管理-11.6 MySQL 错误日志过滤的类型

错误日志过滤的类型
错误日志配置通常包括一个日志过滤器组件和一个或多个日志编写器组件。对于错误日志过滤,MySQL提供了以下组件选择:
•log_filter_internal:此过滤器组件根据日志事件优先级和错误代码以及log_error_verbosity和log_error_suppression_list系统变量提供错误日志过滤。 log_filter_internal内置并默认启用。


•log_filter_dragnet:此过滤器组件结合了dragnet.log_error_filter_rules系统变量,提供了基于用户提供的规则的错误日志过滤。





一、基于优先级的错误日志过滤(log_filter_internal)
log_filter_internal日志过滤器组件根据错误事件优先级和错误代码实现简单形式的日志过滤。要影响log_filter_internal如何允许或禁止针对错误日志的错误,警告和信息事件,请设置log_error_verbosity和log_error_suppression_list系统变量。 log_filter_internal内置并默认启用。如果禁用此过滤器,则log_error_verbosity和log_error_suppression_list无效,因此必须在需要的地方使用其他过滤器服务来对过滤进行建模(例如,使用log_filter_dragnet时使用单独的过滤规则)。
1.详细度过滤

用于错误日志的事件的优先级为ERROR,WARNING或INFORMATION。 log_error_verbosity系统变量根据允许写入日志的消息的优先级来控制详细程度,如下表所示。


Permitted Message Priorities log_error_verbosity Value
ERROR,1
ERROR, WARNING 2
ERROR, WARNING, INFORMATION3



如果log_error_verbosity为2或更大,则服务器将记录有关对基于语句的日志记录不安全的语句的消息。如果值为3,则服务器将记录中止的连接和访问被拒绝的错误,以进行新的连接尝试。


如果使用复制,建议将log_error_verbosity值设置为2或更大,以获取有关正在发生的事情的更多信息,例如有关网络故障和重新连接的消息。


如果从服务器上的log_error_verbosity为2或更大,则从属服务器会将错误消息打印到错误日志中,以提供有关其状态的信息,例如二进制日志和中继日志坐标(当它切换到另一个中继日志时,它将在其开始工作的地方),断开连接后重新连接时,依此类推。


还有SYSTEM的优先级。无论log_error_verbosity值如何,有关非错误情况的系统消息都会打印到错误日志中。这些消息包括启动和关闭消息,以及对设置的一些重大更改。


在MySQL错误日志中,系统消息标记为“系统”。其他日志编写者可能会遵循或可能不会遵循相同的约定,并且在生成的日志中,可能会为系统消息分配用于信息优先级的标签,例如“ Note”或“ Information”。如果您基于消息的标签对日志记录应用任何其他过滤或重定向,系统消息不会覆盖您的过滤器,但由过滤器以与其他消息相同的方式进行处理。


2.抑制列表过滤
log_error_suppression_list系统变量适用于旨在用于错误日志的事件,并指定当发生优先级为WARNING或INFORMATION的事件时要抑制的事件。
如果某种特定类型的警告由于频繁发生但不引起关注而在错误日志中被认为是不希望的“噪音”,则可以将其抑制。
log_error_suppression_list值可以是不抑制的空字符串,也可以是一个或多个逗号分隔值的列表,这些值指示要抑制的错误代码。错误代码可以以符号或数字形式指定。可以指定带或不带MY-前缀的数字代码。数字部分中的前导零并不重要。允许的代码格式示例:



ER_SERVER_SHUTDOWN_COMPLETE
MY-000031
000031
MY-31
31




从可读性和可移植性的角度来看,符号值优于数字值。
尽管要禁止显示的代码可以用符号或数字形式表示,但每个代码的数值必须在允许的范围内:
•1到999:服务器和客户端使用的全局错误代码。
•10000及更高版本:服务器错误代码,打算将其写入错误日志(不发送给客户端)。
另外,指定的每个错误代码实际上必须由MySQL使用。尝试指定不在允许范围内或不在允许范围内但未被MySQL使用的代码会产生错误,并且log_error_suppression_list值保持不变。
服务器可以以不同的优先级为给定的错误代码生成消息,因此对与log_error_suppression_list中列出的错误代码关联的消息的抑制取决于其优先级。假设变量的值为'ER_PARSER_TRACE,MY-010001,10002'。
然后,log_error_suppression_list具有以下效果:
•如果优先级为WARNING或INFORMATION生成这些代码的消息,则这些消息将被抑制。
•不抑制优先级为ERROR或SYSTEM的消息。



3.详细度和抑制列表交互
log_error_verbosity的效果与log_error_suppression_list的效果结合在一起。考虑使用以下设置启动的服务器:



log_error_verbosity=2 # error and warning messages only
log_error_suppression_list='ER_PARSER_TRACE,MY-010001,10002'

在这种情况下,log_error_verbosity允许具有ERROR或WARNING优先级的消息,并丢弃具有INFORMATION优先级的消息。在未丢弃的消息中,log_error_suppression_list丢弃具有WARNING优先级和任何命名的错误代码的消息。



注意
示例中显示的log_error_verbosity值为2也是其默认值,因此默认情况下此变量对INFORMATION消息的影响如前所述,没有显式设置。如果要使log_error_suppression_list影响具有INFORMATION优先级的消息,则必须将log_error_verbosity设置为3。



考虑使用此设置启动的服务器:


log_error_verbosity=1 # error messages only

在这种情况下,log_error_verbosity允许具有ERROR优先级的消息,并丢弃具有WARNING或INFORMATION优先级的消息。设置log_error_suppression_list无效,因为由于log_error_verbosity设置,它可能抑制的所有错误代码已被丢弃。





二、基于规则的错误日志过滤(log_filter_dragnet)
log_filter_dragnet日志过滤器组件可根据用户定义的规则启用日志过滤。要定义适用的规则,请设置dragnet.log_error_filter_rules系统变量。
要启用log_filter_dragnet筛选器,请首先加载筛选器组件,然后修改log_error_services值。
以下示例将log_filter_dragnet与内置日志编写器结合使用:

INSTALL COMPONENT 'file://component_log_filter_dragnet';
SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';




在启用log_filter_dragnet的情况下,通过设置dragnet.log_error_filter_rules系统变量来定义其过滤规则。规则集由零个或多个规则组成,其中每个规则都是以句点(.)字符结尾的IF语句。如果变量值为空(零规则),则不会进行过滤。
示例1.此规则集删除了信息事件,对于其他事件,则删除了source_line字段:


SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=INFORMATION THEN drop. IF EXISTS source_line THEN unset source_line.';


效果类似于log_sink_internal过滤器(设置为log_error_verbosity = 2)执行的过滤。
示例2:此规则将信息事件限制为每60秒不超过一个:


SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=INFORMATION THEN throttle 1/60.';


设置完所需的过滤配置后,请考虑使用SET PERSIST而不是SET GLOBAL分配dragnet.log_error_filter_rules,以使该设置在服务器重新启动后保持不变。或者,将设置添加到服务器选项文件。要停止使用过滤语言,请首先从错误日志记录组件集中将其删除。通常,这意味着使用其他过滤器组件而不是不使用过滤器组件。例如:


SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';



同样,请考虑使用SET PERSIST而不是SET GLOBAL来使设置在服务器重新启动后保持不变。然后卸载过滤器log_filter_dragnet组件:


UNINSTALL COMPONENT 'file://component_log_filter_dragnet';















































页: [1]
查看完整版本: MySQL8.0大师之路:第11章:MySQL服务器管理-11.6 MySQL 错误日志过滤的类型