Documentation Home
MySQL 8.0 参考手册  / 第 5 章 MySQL 服务器管理  / 5.4 MySQL 服务器日志  / 5.4.2 错误日志  /  5.4.2.6 基于规则的错误日志过滤(log_filter_dragnet)

5.4.2.6 基于规则的错误日志过滤(log_filter_dragnet)

log_filter_dragnet日志过滤组件启用基于用户定义规则的日志过滤 。

要启用log_filter_dragnet过滤器,首先加载过滤器组件,然后修改 log_error_services值。以下示例启用log_filter_dragnet 与内置日志接收器的组合:

Press CTRL+C to copy
INSTALL COMPONENT 'file://component_log_filter_dragnet'; SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';

要设置log_error_services为在服务器启动时生效,请使用 第 5.4.2.1 节“错误日志配置”中的说明。这些说明也适用于其他错误记录系统变量。

启用后,通过设置 系统变量log_filter_dragnet定义其过滤规则 。dragnet.log_error_filter_rules规则集由零个或多个规则组成,其中每个规则都是一个IF以句点 ( .) 字符结尾的语句。如果变量值为空(零规则),则不会进行过滤。

示例 1。此规则集删除信息事件,并且对于其他事件,删除source_line字段:

Press CTRL+C to copy
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

为了可读性,您可能会发现最好在单独的行中列出规则。例如:

Press CTRL+C to copy
SET GLOBAL dragnet.log_error_filter_rules = ' IF prio>=INFORMATION THEN drop. IF EXISTS source_line THEN unset source_line. ';

示例 2:此规则将信息事件限制为每 60 秒不超过一个:

Press CTRL+C to copy
SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=INFORMATION THEN throttle 1/60.';

根据需要设置过滤配置后,请考虑分配 dragnet.log_error_filter_rules 使用SET PERSIST而不是 SET GLOBAL使设置在服务器重新启动时保持不变。或者,将设置添加到服务器选项文件。

要停止使用过滤语言,请先将其从错误记录组件集中删除。通常这意味着使用不同的过滤器组件而不是没有过滤器组件。例如:

Press CTRL+C to copy
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';

同样,考虑使用 SET PERSIST而不是 SET GLOBAL使设置在服务器重新启动时保持不变。

然后卸载过滤器log_filter_dragnet 组件:

Press CTRL+C to copy
UNINSTALL COMPONENT 'file://component_log_filter_dragnet';

以下部分 log_filter_dragnet更详细地描述了操作的各个方面:

log_filter_dragnet 规则语言的语法

以下语法定义 log_filter_dragnet过滤规则的语言。每个规则都是一个IF以句点 ( .) 字符结尾的语句。语言不区分大小写。

Press CTRL+C to copy
rule: IF condition THEN action [ELSEIF condition THEN action] ... [ELSE action] . condition: { field comparator value | [NOT] EXISTS field | condition {AND | OR} condition } action: { drop | throttle {count | count / window_size} | set field [:= | =] value | unset [field] } field: { core_field | optional_field | user_defined_field } core_field: { time | msg | prio | err_code | err_symbol | SQL_state | subsystem } optional_field: { OS_errno | OS_errmsg | label | user | host | thread | query_id | source_file | source_line | function | component } user_defined_field: sequence of characters in [a-zA-Z0-9_] class comparator: {== | != | <> | >= | => | <= | =< | < | >} value: { string_literal | integer_literal | float_literal | error_symbol | priority } count: integer_literal window_size: integer_literal string_literal: sequence of characters quoted as '...' or "..." integer_literal: sequence of characters in [0-9] class float_literal: integer_literal[.integer_literal] error_symbol: valid MySQL error symbol such as ER_ACCESS_DENIED_ERROR or ER_STARTUP priority: { ERROR | WARNING | INFORMATION }

简单条件将字段与值或测试字段存在性进行比较。要构造更复杂的条件,请使用 ANDandOR运算符。两个运算符具有相同的优先级并从左到右计算。

要转义字符串中的字符,请在其前面加上反斜杠 ( \)。反斜杠需要包含反斜杠本身或字符串引号字符,其他字符可选。

为方便起见,log_filter_dragnet 支持用于与某些字段进行比较的符号名称。为了可读性和可移植性,符号值(如果适用)优于数值。

  • 事件优先级值 1、2 和 3 可以指定为 ERRORWARNINGINFORMATION。优先级符号仅在与 prio字段进行比较时才被识别。这些比较是等效的:

    Press CTRL+C to copy
    IF prio == INFORMATION THEN ... IF prio == 3 THEN ...
  • 错误代码可以数字形式或相应的错误符号指定。例如, ER_STARTUP是 error 的符号名称1408,所以这些比较是等价的:

    Press CTRL+C to copy
    IF err_code == ER_STARTUP THEN ... IF err_code == 1408 THEN ...

    错误符号仅在与 err_code字段和用户定义的字段进行比较时被识别。

    要查找与给定错误代码编号相对应的错误符号,请使用以下方法之一:

    假设带有错误编号的规则集如下所示:

    Press CTRL+C to copy
    IF err_code == 10927 OR err_code == 10914 THEN drop. IF err_code == 1131 THEN drop.

    使用perror,确定错误符号:

    Press CTRL+C to copy
    $> perror 10927 10914 1131 MySQL error code MY-010927 (ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED): Access denied for user '%-.48s'@'%-.64s'. Account is locked. MySQL error code MY-010914 (ER_ABORTING_USER_CONNECTION): Aborted connection %u to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s). MySQL error code MY-001131 (ER_PASSWORD_ANONYMOUS_USER): You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords

    将错误符号替换为数字,规则集变为:

    Press CTRL+C to copy
    IF err_code == ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED OR err_code == ER_ABORTING_USER_CONNECTION THEN drop. IF err_code == ER_PASSWORD_ANONYMOUS_USER THEN drop.

可以将符号名称指定为带引号的字符串,以便与字符串字段进行比较,但在这种情况下,名称是没有特殊含义的字符串, log_filter_dragnet不会将它们解析为相应的数值。SET此外,拼写错误可能未被发现,而如果尝试使用服务器未知的未加引号的符号, 则会立即发生错误 。

log_filter_dragnet 规则的操作

log_filter_dragnet在过滤规则中支持这些操作:

  • drop:删除当前日志事件(不记录它)。

  • throttle:应用速率限制以减少符合特定条件的事件的日志详细程度。count参数以or count/的形式表示速率 window_size。该count值表示每个时间窗口允许记录的事件发生次数。该window_size值为以秒为单位的时间窗口;如果省略,则默认窗口为 60 秒。两个值都必须是整数文字。

    此规则将插件关闭消息限制为每 60 秒出现 5 次:

    Press CTRL+C to copy
    IF err_code == ER_PLUGIN_SHUTTING_DOWN_PLUGIN THEN throttle 5.

    此规则将错误和警告限制为每小时 1000 次,将信息消息限制为每小时 100 次:

    Press CTRL+C to copy
    IF prio <= INFORMATION THEN throttle 1000/3600 ELSE throttle 100/3600.
  • set:为字段分配一个值(如果该字段不存在,则使该字段存在)。在后续规则中,EXISTS针对字段名的测试为真,可以通过比较条件来测试新值。

  • unset: 丢弃一个字段。在随后的规则中,EXISTS针对字段名称的测试为假,并且该字段与任何值的比较为假。

    在条件只引用一个字段名的特殊情况下,后面的字段名 unset是可选 unset的,并丢弃命名字段。这些规则是等价的:

    Press CTRL+C to copy
    IF myfield == 2 THEN unset myfield. IF myfield == 2 THEN unset.
log_filter_dragnet 规则中的字段引用

log_filter_dragnet规则支持在错误事件中引用核心、可选和用户定义的字段。

核心领域参考

Grammar for log_filter_dragnet Rule Language中 的log_filter_dragnet语法 命名了过滤规则识别的核心字段。有关这些字段的一般描述,请参阅 第 5.4.2.3 节,“错误事件字段”,假定您熟悉这些字段。以下评论仅提供额外信息,因为它特别适用于 规则中使用的核心字段参考。 log_filter_dragnet

  • prio

    事件优先级,用于指示错误、警告或注释/信息事件。在比较中,每个优先级都可以指定为符号优先级名称或整数文字。优先级符号仅在与prio字段进行比较时才被识别。这些比较是等效的:

    Press CTRL+C to copy
    IF prio == INFORMATION THEN ... IF prio == 3 THEN ...

    下表显示了允许的优先级。

    事件类型 优先符号 数字优先级
    错误事件 ERROR 1个
    警告事件 WARNING 2个
    备注/信息事件 INFORMATION 3个

    还有一个消息优先级 SYSTEM,但是系统消息不能被过滤,总是写入错误日志。

    优先级值遵循较高优先级具有较低值的原则,反之亦然。对于最严重的事件(错误),优先级值从 1 开始,随着优先级降低的事件增加。例如,要丢弃优先级低于警告的事件,请测试优先级值高于 WARNING

    Press CTRL+C to copy
    IF prio > WARNING THEN drop.

    以下示例显示了 log_filter_dragnet实现类似于 过滤器 log_error_verbosity允许的每个值的效果的规则:log_filter_internal

    • 仅错误 ( log_error_verbosity=1):

      Press CTRL+C to copy
      IF prio > ERROR THEN drop.
    • 错误和警告 ( log_error_verbosity=2):

      Press CTRL+C to copy
      IF prio > WARNING THEN drop.
    • 错误、警告和注释 ( log_error_verbosity=3):

      Press CTRL+C to copy
      IF prio > INFORMATION THEN drop.

      该规则实际上可以省略,因为没有 prio大于 的值 INFORMATION,因此实际上它什么都不丢弃。

  • err_code

    数字事件错误代码。在比较中,要测试的值可以指定为符号错误名称或整数文字。错误符号仅在与err_code字段和用户定义的字段进行比较时被识别。这些比较是等效的:

    Press CTRL+C to copy
    IF err_code == ER_ACCESS_DENIED_ERROR THEN ... IF err_code == 1045 THEN ...
  • err_symbol

    事件错误符号,作为字符串(例如, 'ER_DUP_KEY')。 err_symbolvalues 更多地用于识别日志输出中的特定行而不是用于过滤规则比较,因为 log_filter_dragnet它不会将指定为字符串的比较值解析为等效的数字错误代码。(要发生这种情况,必须使用不带引号的符号指定错误。)

可选字段参考

Grammar for log_filter_dragnet Rule Language中 的log_filter_dragnet语法 命名过滤规则识别的可选字段。有关这些字段的一般描述,请参阅 第 5.4.2.3 节,“错误事件字段”,假定您熟悉这些字段。以下备注仅提供额外信息,因为它特别适用于 规则中使用的可选字段引用。 log_filter_dragnet

  • label

    与值对应的标签prio ,作为字符串。过滤规则可以更改支持自定义标签的日志接收器的标签。 labelvalues 更多地用于识别日志输出中的特定行而不是用于过滤规则比较,因为 log_filter_dragnet不会将指定为字符串的比较值解析为等效的数字优先级。

  • source_file

    事件发生的源文件,没有任何前导路径。例如,要测试 sql/gis/distance.cc文件,可以这样写比较:

    Press CTRL+C to copy
    IF source_file == "distance.cc" THEN ...
用户定义的字段引用

log_filter_dragnet 过滤规则中未被识别为核心或可选字段名称的 任何字段名称均被视为引用用户定义的字段。