每个错误日志接收器(写入器)组件都有一个用于将消息写入其目的地的特征输出格式,但其他因素可能会影响消息的内容:
日志接收器可用的信息。如果在接收器组件执行之前执行的日志筛选器组件删除了日志事件字段,则该字段不可用于写入。日志过滤的详细信息请参见5.4.2.4“错误日志过滤的类型”。
日志接收器相关的信息。并不是每个接收器都写入错误事件中可用的所有字段。
系统变量可能会影响日志汇聚。看到影响错误日志格式的系统变量。
有关错误事件中字段的名称和描述,请参阅第5.4.2.3节“错误事件字段”。对于所有日志接收器,错误日志消息中包含的线程ID是其中线程的IDmysqld负责写留言。这个ID表示服务器的哪个部分产生了消息,并且与一般查询日志和慢速查询日志消息一致,后者包括连接线程ID。
内部日志接收器产生传统的错误日志输出。例如:
2020-08-06T14:25:02.835618Z 0 [注意] [INNODB] DDL日志恢复:开始2020-08-06T14:25:02.936146Z 0 [警告] [MY-010068] [服务器] CA证书/var/mysql/sslinfo/cacert.pem是自签名的。2020-08-06T14:25:02.963127Z 0 [注意] [MY-010253] [服务器] IPv6可用。2020-08-06T14:25:03.109022Z 5 [注意] [MY-010051] [服务器]事件调度程序:Scheduler Thread以ID 5启动
传统格式的消息有以下字段:
时间线程[label] [err_code][子系统]MSG
的(
和]
方括号字符是消息格式中的字面字符。它们并不表示字段是可选的。
的标签
值对应于字符串形式一家
错误事件优先级字段。
的(err_code)
和(子系统)
MySQL 8.0中增加了字段。旧服务器生成的日志中没有它们。日志解析器可以将这些字段视为消息文本的一部分,这些字段只出现在最近写入的包含它们的服务器的日志中。解析器必须处理err_code
部分(err_code)
指示符作为字符串值,而不是数字,因为值如我的- 012487
和我的- 010051
包含非数字字符。
JSON格式的日志接收器以包含键值对的JSON对象的形式产生消息。例如:
{"prio": 3, "err_code": 10051, "source_line": 561, "source_file": "event_scheduler. exe ";cc", "function": "run", "msg": "Event Scheduler: Scheduler thread started with id 5", "time": "2020-08-06T14:25:03.109022Z", "ts": 1596724012005, "thread": 5, "err_symbol": "ER_SCHEDULER_STARTED", "SQL_state": "HY000", "subsystem": "Server", "buffered": 1596723903109022, "label": "Note"}
为了可读性,显示的消息被重新格式化。写入错误日志的事件每行显示一条消息。
的ts
(timestamp)键是在MySQL 8.0.20中添加的,它对json格式的日志接收器是唯一的。该值是一个整数,表示从epoch (“1970-01-01”就是
UTC)。
的ts
和缓冲的
值是Unix时间戳值,可以使用FROM_UNIXTIME ()
和适当的除法者:
mysql> SET time_zone = '+00:00';mysql >选择FROM_UNIXTIME (1596724012005/1000.0);+-------------------------------------+ | FROM_UNIXTIME (1596724012005/1000.0 ) | +-------------------------------------+ | 2020-08-06 14:26:52.0050 | +-------------------------------------+ mysql >选择FROM_UNIXTIME (1596723903109022/1000000.0);+-------------------------------------------+ | FROM_UNIXTIME (1596723903109022/1000000.0 ) | +-------------------------------------------+ | 2020-08-06 14:25:03.1090 | +-------------------------------------------+
在启动选项被处理之前,服务器会生成一些错误日志消息,因此在它知道错误日志设置(例如log_error_verbosity.
和log_timestamps
系统变量的值,在它知道要使用哪个日志组件之前。服务器处理启动过程中早期生成的错误日志信息如下:
在MySQL 8.0.14之前,服务器使用默认的时间戳、格式和详细级别生成消息,并对它们进行缓冲。在处理启动选项并知道错误日志配置之后,服务器将刷新缓冲的消息。因为这些早期消息使用默认的日志配置,它们可能与启动选项指定的不同。此外,除了默认消息外,早期消息不会被刷新到日志接收器。例如,到JSON接收器的日志不包括这些早期消息,因为它们不是JSON格式的。
从MySQL 8.0.14开始,服务器缓存日志事件而不是格式化的日志消息。这使它能够在已知设置后对这些事件回溯地应用配置设置,结果是刷新的消息使用配置的设置,而不是默认设置。此外,消息将被刷新到所有已配置的接收器,而不仅仅是默认接收器。
如果在日志配置之前发生致命错误并且服务器必须退出,则服务器使用日志记录默认值格式化缓冲的消息,以便它们不会丢失。如果没有发生致命错误但在处理启动选项之前,启动过度速度,服务器会定期格式化并使用日志记录默认值刷新缓冲消息,以便不显示无响应。虽然此行为类似于8.0.14前的行为,但在使用默认值时,优选在出现异常情况时丢失消息。
的log_timestamps
系统变量控制写入错误日志(以及一般查询日志和慢速查询日志文件)的消息中的时间戳的时区。服务器应用log_timestamps
在事件到达任何日志接收器之前出错;因此,它会影响所有接收器的错误消息输出。
允许log_timestamps
值是UTC
(默认)和系统
(本地系统时区)。时间戳使用ISO 8601 / RFC 3339格式编写:
加上尾部值yyyy-mm-dd
Thh: mm: ss.uuuuuu
Z
表示祖鲁时间(UTC)或±hh:mm
(表示相对于UTC的本地系统时区调整的偏移量)。例如:
2020-08-07t15:02:00.832521z (utc)