#### 5.4.2.6 基于规则的错误日志过滤（日志\_筛选\_拉网）

这`log_filter_dragnet`日志过滤器组件根据用户定义的规则启用日志过滤。

要启用`log_filter_dragnet`过滤器，首先加载过滤器组件，然后修改[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)价值。以下示例启用`log_filter_dragnet`结合内置日志接收器：

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

设置[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)要在服务器启动时生效，请使用以下说明[第 5.4.2.1 节，“错误日志配置”](error-log-configuration.html).这些说明也适用于其他错误记录系统变量。

和`log_filter_dragnet`启用，通过设置定义其过滤规则[`dragnet.log_error_filter_rules`](server-system-variables.html#sysvar_dragnet.log_error_filter_rules)系统变量。一个规则集由零个或多个规则组成，其中每个规则是一个`如果`语句以句点终止 (`.`)性格。如果变量值为空（零规则），则不会进行筛选。

例1。此规则集删除信息事件，对于其他事件，删除`源线`字段：

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

其效果类似于`日志\水槽\内部`设置为的过滤器[`日志错误详细度=2`](server-system-variables.html#sysvar_log_error_verbosity).

为了便于阅读，您可能会发现最好在单独的行中列出规则。例如：

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

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

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

一旦你有了你想要的过滤配置，考虑分配。[`拉网。日志错误过滤规则`](server-system-variables.html#sysvar_dragnet.log_error_filter_rules)使用[`设定持续时间`](set-variable.html)而不是[`设置全局`](set-variable.html)使设置在服务器重新启动期间保持不变。或者，将该设置添加到服务器选项文件中。

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

```
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
```

再次考虑使用[`设定持续时间`](set-variable.html)而不是[`设置全局`](set-variable.html)使设置在服务器重新启动期间保持不变。

然后卸载过滤器`原木过滤网`组成部分：

```
UNINSTALL COMPONENT 'file://component_log_filter_dragnet';
```

以下各节描述了`原木过滤网`更详细的操作：

-   [日志语法\_滤器\_拖网规则语言](error-log-rule-based-filtering.html#error-log-dragnet-filtering-language)

-   [日志的操作\_滤器\_拉网规则](error-log-rule-based-filtering.html#error-log-dragnet-filtering-actions)

-   [日志中的字段引用\_滤器\_拉网规则](error-log-rule-based-filtering.html#error-log-dragnet-filtering-fields)

##### 日志语法\_滤器\_拖网规则语言

下面的语法定义了`原木过滤网`过滤规则。每一条规则都是一条规则`如果`以句号终止的声明(`.`)性格。该语言不区分大小写。

```
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
}
```

简单条件将字段与值或测试字段进行比较。要构造更复杂的条件，请使用`和`和`或`接线员。两个运算符的优先级相同，从左到右求值。

要转义字符串中的字符，请在其前面加反斜杠(`\`)。反斜杠必须包含反斜杠本身或字符串引用字符，其他字符可选。

为了方便起见，`原木过滤网`支持与某些字段进行比较的符号名。为了可读性和可移植性，符号值比数值更可取（如果适用）。

-   事件优先级值1、2和3可以指定为`错误`, `警告`和`信息`.优先级符号仅在与`普里奥`领域这些比较相当于：

    ```
    IF prio == INFORMATION THEN ...
    IF prio == 3 THEN ...
    ```

-   错误代码可以以数字形式指定，也可以作为相应的错误符号指定。例如[`ER_创业公司`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_startup)是错误的符号名`1408`，因此这些比较是等效的：

    ```
    IF err_code == ER_STARTUP THEN ...
    IF err_code == 1408 THEN ...
    ```

    错误符号仅在与`错误代码`字段和用户定义的字段。

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

    -   查看服务器错误列表[服务器错误消息引用](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html).

    -   使用[**佩罗尔**](perror.html)命令给定一个错误号参数，[**佩罗尔**](perror.html)显示有关错误的信息，包括其符号。

        假设一个包含错误号的规则集如下所示：

        ```
        IF err_code == 10927 OR err_code == 10914 THEN drop.
        IF err_code == 1131 THEN drop.
        ```

        使用[**佩罗尔**](perror.html)，确定错误符号：

        ```
        $> 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
        ```

        将错误符号替换为数字，规则集变为：

        ```
        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.
        ```

    可以将符号名指定为带引号的字符串，以便与字符串字段进行比较，但在这种情况下，这些名称是没有特殊含义的字符串`原木过滤网`不会将它们解析为相应的数值。此外，打字错误可能不会被发现，而错误会立即发生`设置`用于尝试使用服务器未知的无引号符号。

##### 日志的操作\_滤器\_拉网规则

`原木过滤网`在筛选规则中支持以下操作：

-   `滴`：删除当前日志事件（不记录）。

-   `掐死`：对符合特定条件的事件应用速率限制，以减少日志冗余度。参数表示一个速率，形式为*`计数`*或*`计数`*/*`窗口大小`*这个*`计数`*值表示每个时间窗口允许记录的事件发生次数。这个*`窗口大小`*值是以秒为单位的时间窗口；如果省略，默认窗口为60秒。这两个值都必须是整型文字。

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

    ```
    IF err_code == ER_PLUGIN_SHUTTING_DOWN_PLUGIN THEN throttle 5.
    ```

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

    ```
    IF prio <= INFORMATION THEN throttle 1000/3600 ELSE throttle 100/3600.
    ```

-   `设置`：为字段指定一个值（如果该字段尚未存在，则使其存在）。在随后的规则中，`存在`对字段名的测试为true，可以通过比较条件测试新值。

-   `解除`：放弃一个字段。在随后的规则中，`存在`对字段名的测试为false，对字段与任何值的比较为false。

    在条件仅指一个字段名的特殊情况下，字段名如下`解除`是可选的，并且`解除`丢弃命名字段。这些规则相当于：

    ```
    IF myfield == 2 THEN unset myfield.
    IF myfield == 2 THEN unset.
    ```

##### 日志中的字段引用\_滤器\_拉网规则

`原木过滤网`规则支持在错误事件中引用核心字段、可选字段和用户定义字段。

-   [核心领域参考](error-log-rule-based-filtering.html#error-log-dragnet-core-field-references)

-   [可选字段引用](error-log-rule-based-filtering.html#error-log-dragnet-optional-field-references)

-   [用户定义的字段引用](error-log-rule-based-filtering.html#error-log-dragnet-user-defined-field-references)

###### 核心领域参考

这个`原木过滤网`语法[日志语法\_滤器\_拖网规则语言](error-log-rule-based-filtering.html#error-log-dragnet-filtering-language)命名筛选规则识别的核心字段。有关这些字段的一般说明，请参见[第5.4.2.3节“错误事件字段”](error-log-event-fields.html)，你被认为是熟悉的。以下备注仅提供与本文件中使用的核心字段参考相关的附加信息`原木过滤网`规则。

-   `普里奥`

    事件优先级，指示错误、警告或注释/信息事件。在比较中，每个优先级可以指定为符号优先级名称或整数文本。优先级符号仅在与`普里奥`领域这些比较相当于：

    ```
    IF prio == INFORMATION THEN ...
    IF prio == 3 THEN ...
    ```

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

    | 事件类型 | 优先权符号 | 数字优先级 |
    | ---- | ----- | ----- |
    | 错误事件 | `错误` | 1. |
    | 警告事件 | `警告` | 2. |
    | 说明/信息活动 | `信息` | 3. |

    还有一个消息优先级为`系统`，但系统消息无法过滤，并且总是写入错误日志。

    优先级值遵循的原则是，优先级越高，值越低，反之亦然。对于最严重的事件（错误），优先级值从1开始，对于优先级降低的事件，优先级值增加。例如，要放弃优先级低于警告的事件，请测试优先级值是否高于警告`警告`:

    ```
    IF prio > WARNING THEN drop.
    ```

    以下示例显示了`原木过滤网`规则，以达到相似的效果[`日志错误详细`](server-system-variables.html#sysvar_log_error_verbosity)合同允许的价值`日志过滤器内部`过滤器：

    -   只有错误(`日志错误详细度=1`):

        ```
        IF prio > ERROR THEN drop.
        ```

    -   错误和警告(`日志错误详细度=2`):

        ```
        IF prio > WARNING THEN drop.
        ```

    -   错误、警告和注释(`日志错误详细度=3`):

        ```
        IF prio > INFORMATION THEN drop.
        ```

        这条规则实际上可以省略，因为没有`普里奥`值大于`信息`，所以实际上它不会掉任何东西。

-   `错误代码`

    数字事件错误代码。在比较中，要测试的值可以指定为符号错误名称或整数文本。错误符号仅在与`错误代码`字段和用户定义的字段。这些比较相当于：

    ```
    IF err_code == ER_ACCESS_DENIED_ERROR THEN ...
    IF err_code == 1045 THEN ...
    ```

-   `错误符号`

    事件错误符号，作为字符串（例如，[`“ER_DUP_KEY”`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_dup_key)). `错误符号`值更多地用于标识日志输出中的特定行，而不是用于筛选规则比较，因为`原木过滤网`不将指定为字符串的比较值解析为等效的数字错误代码。（要发生这种情况，必须使用其不带引号的符号指定错误。）

###### 可选字段引用

这个`原木过滤网`语法[日志语法\_滤器\_拖网规则语言](error-log-rule-based-filtering.html#error-log-dragnet-filtering-language)命名筛选规则识别的可选字段。有关这些字段的一般说明，请参见[第5.4.2.3节“错误事件字段”](error-log-event-fields.html)，你被认为是熟悉的。以下备注仅提供与中使用的可选字段引用相关的附加信息`原木过滤网`规则。

-   `标签`

    对应于`普里奥`值，作为字符串。过滤规则可以更改支持自定义标签的日志接收器的标签。`标签`值更多地用于标识日志输出中的特定行，而不是用于筛选规则比较，因为`原木过滤网`不将指定为字符串的比较值解析为等效的数字优先级。

-   `源文件`

    事件发生的源文件，没有任何前导路径。例如，测试`sql/gis/distance。复写的副本`文件中，按如下方式编写比较：

    ```
    IF source_file == "distance.cc" THEN ...
    ```

###### 用户定义的字段引用

字段中的任何字段名`原木过滤网`未被识别为核心或可选字段名的筛选规则用于引用用户定义的字段。
