7.4.2.9 错误日志输出格式
每个错误日志写入组件(writer)都有其特定的输出格式,用于将消息写入到目的地,但是其他因素也可能影响消息的内容:
-
可供日志写入组件的信息。如果在执行日志写入组件之前,日志过滤器组件移除了一个日志事件字段,那么这个字段不可用用于写入。关于日志 filtering 的信息,请参见第 7.4.2.4 节,“错误日志 filtering”。
-
可供日志写入组件的信息。不是每个写入器都写出所有错误事件中的字段。
-
系统变量可能会影响日志写入器。请参见影响错误日志格式的系统变量。
关于错误事件字段的名称和描述,请参见第 7.4.2.3 节,“错误事件字段”。对于所有日志写入器,错误日志消息中的线程 ID 是负责写入消息的mysqld服务器中的线程 ID。这 ID 表示产生消息的一部分,是与一般查询日志和慢查询日志消息一致的,包括连接线程 ID。
内部日志sink产生传统错误日志输出。例如:
2020-08-06T14:25:02.835618Z 0 [Note] [MY-012487] [InnoDB] DDL log recovery : begin
2020-08-06T14:25:02.936146Z 0 [Warning] [MY-010068] [Server] CA certificate /var/mysql/sslinfo/cacert.pem is self signed.
2020-08-06T14:25:02.963127Z 0 [Note] [MY-010253] [Server] IPv6 is available.
2020-08-06T14:25:03.109022Z 5 [Note] [MY-010051] [Server] Event Scheduler: scheduler thread started with id 5
传统格式消息具有这些字段:
time thread [label] [err_code] [subsystem] msg
中括号字符[
和]
在消息格式中是字面字符,不表示字段可选。
标签值对应于prio
错误事件优先级字段的字符串形式。
从MySQL 8.0开始添加的[err_code]
和[subsystem]
字段,在由更早版本服务器生成的日志中将缺失。日志解析器可以将这些字段视为仅在包含它们的日志中出现的消息文本的一部分。解析器必须将err_code
部分[err_code]
指示符视为字符串值,而不是数字,因为值如MY-012487
和MY-010051
包含非数字字符。
JSON格式日志源生产的消息是 JSON 对象,包含键值对。例如:
{
"prio": 3,
"err_code": 10051,
"source_line": 561,
"source_file": "event_scheduler.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
(时间戳)键独特于 JSON格式日志源。值是一个表示自 epoch(‘1970-01-01 00:00:00’ UTC)的毫秒整数。
ts
和 buffered
值是 Unix 时间戳值,可以使用 FROM_UNIXTIME()
和合适的除法器进行转换:
mysql> SET time_zone = '+00:00';
mysql> SELECT FROM_UNIXTIME(1596724012005/1000.0);
+-------------------------------------+
| FROM_UNIXTIME(1596724012005/1000.0) |
+-------------------------------------+
| 2020-08-06 14:26:52.0050 |
+-------------------------------------+
mysql> SELECT FROM_UNIXTIME(1596723903109022/1000000.0);
+-------------------------------------------+
| FROM_UNIXTIME(1596723903109022/1000000.0) |
+-------------------------------------------+
| 2020-08-06 14:25:03.1090 |
+-------------------------------------------+
系统日志源生产的输出符合本地平台上的系统日志格式。
服务器在启动选项被处理前生成一些错误日志消息,且不知道错误日志设置,如log_error_verbosity
和 log_timestamps
系统变量值,且不知道要使用哪些日志组件。服务器在启动过程的早期生成错误日志消息如下处理:
-
服务器缓冲日志事件(而不是格式化的日志消息),这样可以在配置设置已知后对这些事件进行回溯应用,使flushed消息使用配置设置,而不是默认设置。同时,消息也会被flush到所有配置的收集器中,而不仅仅是默认收集器。
如果在日志配置未知时出现致命错误,服务器将使用logging defaults格式化缓冲区消息,以免消息丢失。如果没有致命错误,但启动过程过慢,服务器也会周期性地格式化和flush缓冲区消息,以避免出现不响应状态。虽然这行为使用默认设置,但是在异常情况下仍然是更好的选择。
系统变量log_timestamps
控制错误日志、通用查询日志和慢查询日志文件中的时间戳的时区。服务器在错误事件到达任何收集器前,对log_timestamps
应用于错误消息输出,从而影响所有收集器的错误消息输出。
允许的log_timestamps
值是UTC
(默认)和SYSTEM
(本地系统时间区间)。时间戳使用ISO 8601 / RFC 3339格式:
加上尾值YYYY-MM-DD
Thh:mm:ss.uuuuuu
Z
(指示UTC时间)或±hh:mm
(相对于UTC的本地系统时间区间调整)。例如:
2020-08-07T15:02:00.832521Z (UTC)
2020-08-07T10:02:00.832521-05:00 (SYSTEM)