必须先安装component_log_sink_json组件,再修改log_error_services,否则json日志不会生成;仅改配置不装组件,日志仍为纯文本。

必须先安装 component_log_sink_json 组件,再修改 log_error_services,否则 JSON 日志不会生成——仅改配置不装组件,日志照旧是纯文本。
INSTALL COMPONENT 是前提,不是可选步骤
MySQL 8.0 默认不加载 JSON 写入器,log_sink_json 属于“可加载组件”,必须显式安装。没这步,后续所有 SET 操作都无效。
- 执行
INSTALL COMPONENT 'file://component_log_sink_json';(注意路径前缀file://不能省,也不能写成file:///或本地绝对路径) - 若报错
Component not found,说明组件文件缺失:检查plugin_dir下是否存在component_log_sink_json.so(Linux)或.dll(Windows),路径可通过SELECT @@plugin_dir;确认 - 安装后无需重启,但需确保当前用户有
SYSTEM_VARIABLES_ADMIN和COMPONENT_ADMIN权限
log_error_services 必须包含 sink 才能输出
log_error_services 是执行链,顺序决定行为。只写 log_filter_internal 不写 sink,日志直接丢弃;漏掉 log_sink_json,就还是老格式。
- 启用 JSON 的最小有效值:
SET PERSIST log_error_services = 'log_filter_internal; log_sink_json'; - 如果还想保留传统文本日志,可叠加:
SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json'; - 多个 sink 会各自输出:文本日志写入
log_error指定路径,JSON 日志则生成log_error值 +.00.json、.01.json等滚动文件 - 切勿写成
log_sink_json; log_filter_internal——过滤器必须在 sink 前,否则未过滤的日志全量进 JSON
log_error 路径决定 JSON 文件名和权限
JSON 写入器不自己指定路径,它完全依赖 log_error 系统变量的值。这个值一旦设错,JSON 文件可能创建失败、写入乱目录,或因权限被拒而静默丢弃。
-
log_error必须在[mysqld]段中配置为**绝对路径**,例如log_error = /var/log/mysql/error.log - 目录需提前创建并授权:
sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql - 若
log_error = stderr,JSON 会输出到控制台(不推荐生产环境);若log_error未设置或为空,JSON 将尝试写入默认路径(如/var/lib/mysql/hostname.err.00.json),但该目录通常无写权限 - SELinux 启用时,还需额外放行:
sudo setsebool -P mysqld_disable_trans on或调整mysqld_log_t上下文
验证 JSON 是否真正生效
改完配置不等于日志就变 JSON。常见假成功:服务重启了、log_error_services 查看值对了、但 error.log.00.json 始终为空。
- 触发一条错误(如用错密码登录):
mysql -u root -pwrongpass,然后检查ls -l /var/log/mysql/error.log.*.json - 用
jq -s '.[0].msg' /var/log/mysql/error.log.00.json看是否解析出字符串,而非报错Invalid UTF-8 byte(后者说明仍是纯文本) - 查表验证:
SELECT * FROM performance_schema.error_log LIMIT 1;—— 若启用了 JSON sink,该表仍只存传统格式内容,error_log表不反映 JSON 输出 - 最直接方式:
tail -f /var/log/mysql/error.log.00.json实时观察新 JSON 行是否追加
最容易被忽略的是:JSON 日志文件名由 log_error 值派生,但权限检查发生在 mysqld 启动时;哪怕你改完 log_error 并重启,若目录权限没同步更新,JSON 写入器会在首次尝试时失败并静默跳过,后续不再重试——此时 error.log.00.json 根本不会被创建。










