MySQL8 中文参考(二十)(4)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL8 中文参考(二十)

MySQL8 中文参考(二十)(3)https://developer.aliyun.com/article/1566109


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

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

要启用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_error_services在服务器启动时生效,请使用第 7.4.2.1 节“错误日志配置”中的说明。这些说明也适用于其他错误日志系统变量。

启用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_error_verbosity=2设置的log_sink_internal过滤器执行的过滤。

为了可读性,您可能会发现将规则列在单独的行上更可取。例如:

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.';

一旦您按照您的意愿设置了过滤配置,请考虑使用SET PERSIST而不是SET GLOBAL来分配dragnet.log_error_filter_rules,以使设置在服务器重新启动时持久化。或者,将设置添加到服务器选项文件中。

当使用log_filter_dragnet时,log_error_suppression_list会被忽略。

要停止使用过滤语言,首先从错误日志组件集中删除它。通常这意味着使用不同的过滤组件而不是没有过滤组件。例如:

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';

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

  • log_filter_dragnet 规则语言的语法
  • log_filter_dragnet 规则的操作
  • log_filter_dragnet 规则中的字段引用
log_filter_dragnet 规则语言的语法

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

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

简单条件将字段与值进行比较或测试字段是否存在。要构建更复杂的条件,请使用ANDOR运算符。这两个运算符具有相同的优先级,并且从左到右进行评估。

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

为方便起见,log_filter_dragnet支持对某些字段进行比较的符号名称。为了可读性和可移植性,符号值比数值值更可取(适用的情况下)。

  • 事件优先级值 1、2 和 3 可以指定为ERRORWARNINGINFORMATION。优先级符号仅在与prio字段进行比较时才被识别。这些比较是等效的:
IF prio == INFORMATION THEN ...
IF prio == 3 THEN ...
  • 错误代码可以以数字形式或相应的错误符号指定。例如,ER_STARTUP是错误1408的符号名称,因此这些比较是等效的:
IF err_code == ER_STARTUP THEN ...
IF err_code == 1408 THEN ...
  • 仅在与err_code字段和用户定义字段进行比较时才识别错误符号。要找到与给定错误代码号对应的错误符号,请使用以下方法之一:
  • 在服务器错误消息参考中查看服务器错误列表。
  • 使用perror命令。给定一个错误号参数,perror会显示有关错误的信息,包括其符号。
  • 假设一个带有错误号的规则集如下所示:
IF err_code == 10927 OR err_code == 10914 THEN drop.
IF err_code == 1131 THEN drop.
  • 使用perror,确定错误符号:
$> 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.

符号名称可以作为带引号的字符串指定,用于与字符串字段进行比较,但在这种情况下,名称是没有特殊含义的字符串,log_filter_dragnet不会将其解析为相应的数值。此外,拼写错误可能不会被检测到,而在尝试使用服务器不认识的未引用符号时,SET会立即出现错误。

log_filter_dragnet 规则的操作

log_filter_dragnet 在过滤规则中支持以下操作:

  • drop: 丢弃当前日志事件(不记录)。
  • throttle: 应用速率限制以减少匹配特定条件的事件的日志冗余。参数表示速率,形式为*countcount/window_sizecount值表示每个时间窗口允许记录的事件发生次数。window_size*值是以秒为单位的时间窗口;如果省略,则默认窗口为 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.
  • set: 为字段赋值(如果字段不存在,则创建)。在后续规则中,对字段名称的EXISTS测试为真,并且新值可以通过比较条件进行测试。
  • unset: 丢弃一个字段。在后续规则中,对字段名称的EXISTS测试为假,并且对字段与任何值的比较为假。
    在条件引用确切一个字段名称的特殊情况下,unset后面的字段名称是可选的,unset会丢弃命名字段。以下规则是等效的:
IF myfield == 2 THEN unset myfield.
IF myfield == 2 THEN unset.
log_filter_dragnet 规则中的字段引用

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

  • 核心字段引用
  • 可选字段引用
  • 用户定义字段引用
核心字段引用

log_filter_dragnet 规则语言语法中列出了过滤规则识别的核心字段。有关这些字段的一般描述,请参见 7.4.2.3 节“错误事件字段”,假定您已经熟悉。以下备注仅提供与log_filter_dragnet规则中核心字段引用相关的特定信息。

  • prio事件优先级,用于指示错误、警告或注释/信息事件。在比较中,每个优先级可以指定为符号优先级名称或整数文字。优先级符号仅在与prio字段的比较中被识别。以下比较是等效的:
IF prio == INFORMATION THEN ...
IF prio == 3 THEN ...
  • 以下表格显示了允许的优先级级别。
事件类型 优先级符号 数字优先级
错误事件 ERROR 1
警告事件 WARNING 2
注意/信息事件 信息 3
  • 还有一个消息优先级为 SYSTEM,但系统消息无法被过滤,并且始终写入错误日志。优先级值遵循更高优先级具有较低值,反之亦然的原则。优先级值从最严重事件(错误)开始为 1,并随着优先级降低的事件而增加。例如,要丢弃优先级低于警告的事件,请测试高于 WARNING 的优先级值:
IF prio > WARNING THEN drop.
  • 以下示例显示了实现与每个 log_error_verbosity 值类似效果的 log_filter_dragnet 规则:
  • 仅错误(log_error_verbosity=1):
IF prio > ERROR THEN drop.
  • 错误和警告(log_error_verbosity=2):
IF prio > WARNING THEN drop.
  • 错误、警告和注释(log_error_verbosity=3):
IF prio > INFORMATION THEN drop.
  • 实际上,这个规则可以被省略,因为没有比 INFORMATION 更大的 prio 值,因此实际上它什么也不丢弃。
  • err_code
    数字事件错误代码。在比较中,要测试的值可以指定为符号错误名称或整数文字。错误符号仅在与 err_code 字段和用户定义字段的比较中被识别。这些比较是等效的:
IF err_code == ER_ACCESS_DENIED_ERROR THEN ...
IF err_code == 1045 THEN ...
  • err_symbol
    事件错误符号,作为字符串(例如,'ER_DUP_KEY')。 err_symbol 值更适用于识别日志输出中的特定行,而不适用于用于过滤规则比较,因为 log_filter_dragnet 不会将指定为字符串的比较值解析为等效的数值错误代码。(为了发生这种情况,必须使用未引用的符号指定错误。)
可选字段引用

log_filter_dragnet 语法在 Grammar for log_filter_dragnet  Rule Language 中命名了过滤规则识别的可选字段。有关这些字段的一般描述,请参见 Section 7.4.2.3, “Error  Event Fields”,假定您已熟悉。以下备注仅提供与 log_filter_dragnet 规则中使用的可选字段引用相关的特定信息。

  • 标签
    prio 值对应的标签,作为字符串。过滤规则可以更改支持自定义标签的日志接收器的标签。 label 值更适用于识别日志输出中的特定行,而不适用于用于过滤规则比较,因为 log_filter_dragnet 不会将指定为字符串的比较值解析为等效的数值优先级。
  • source_file
    事件发生的源文件,不包含任何前导路径。例如,要测试 sql/gis/distance.cc 文件,写比较如下:
IF source_file == "distance.cc" THEN ...
用户定义字段引用

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

原文:dev.mysql.com/doc/refman/8.0/en/error-log-json.html

7.4.2.7 JSON 格式错误日志

本节描述了如何使用内置过滤器log_filter_internal和 JSON sinklog_sink_json立即生效并在后续服务器启动时生效。有关配置错误日志的一般信息,请参阅 Section 7.4.2.1, “错误日志配置”。

要启用 JSON sink,请首先加载 sink 组件,然后修改log_error_services的值:

INSTALL COMPONENT 'file://component_log_sink_json';
SET PERSIST log_error_services = 'log_filter_internal; log_sink_json';

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

log_error_services的值中可以多次命名log_sink_json。例如,要使用一个实例写入未经过滤的事件,使用另一个实例写入经过滤的事件,可以设置log_error_services如下:

SET PERSIST log_error_services = 'log_sink_json; log_filter_internal; log_sink_json';

JSON sink 根据默认错误日志目的地确定其输出目的地,该目的地由log_error系统变量给出。如果log_error命名一个文件,则 JSON sink 基于该文件名进行输出文件命名,加上一个编号为.*NN*.json的后缀,其中*NN从 00 开始。例如,如果log_errorfile_name*,则在log_error_services的值中连续的log_sink_json实例将写入*file_name*.00.json*file_name*.01.json等。

如果log_errorstderr,则 JSON sink 写入控制台。如果在log_error_services的值中多次命名log_sink_json,它们都将写入控制台,这可能没有用处。

原文:dev.mysql.com/doc/refman/8.0/en/error-log-syslog.html


MySQL8 中文参考(二十)(5)https://developer.aliyun.com/article/1566111

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十三)(3)
MySQL8 中文参考(二十三)
49 4
|
4月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
75 3
|
4月前
|
存储 监控 Java
MySQL8 中文参考(二十一)(4)
MySQL8 中文参考(二十一)
116 3
|
4月前
|
存储 安全 关系型数据库
MySQL8 中文参考(二十一)(1)
MySQL8 中文参考(二十一)
47 3
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十一)(3)
MySQL8 中文参考(二十一)
65 2
|
4月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十一)(2)
MySQL8 中文参考(二十一)
60 2
|
4月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8 中文参考(二十五)(5)
MySQL8 中文参考(二十五)
42 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(1)
MySQL8 中文参考(二十四)
46 2
|
4月前
|
NoSQL 关系型数据库 MySQL
MySQL8 中文参考(二十三)(2)
MySQL8 中文参考(二十三)
53 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十三)(1)
MySQL8 中文参考(二十三)
32 2
下一篇
无影云桌面