必须在[mysqld]段显式配置general_log、general_log_file和log_output三者,缺一不可;只写general_log = ON会导致日志静默失效,因MySQL 8.0不自动创建目录、不校验权限、不报错,常见原因包括路径不存在、mysql用户无写权限、log_output未设为FILE或配置错段落。

必须在[mysqld]段显式配置general_log、general_log_file和log_output三者,缺一不可;只写general_log = ON会导致日志静默失效。
为什么改了general_log = ON却没日志文件?
MySQL 8.0 不会自动创建日志目录或赋予写权限,也不会报错提示。常见失效原因包括:
-
general_log_file指定的路径(如/var/log/mysql/general.log)父目录不存在 - 该路径所在目录属主不是
mysql:mysql,MySQL 进程无写入权限 - 漏配
log_output = FILE,导致即使general_log = ON也无输出目标 - 配置写在
[client]或[mysql]段,而非[mysqld]段,被完全忽略
my.cnf中必须写的三行配置
在/etc/my.cnf或/etc/mysql/my.cnf的[mysqld]段下添加:
general_log = ON general_log_file = /var/log/mysql/general.log log_output = FILE
注意:
-
general_log值用ON或1均可,但推荐ON保持语义清晰 -
general_log_file必须是绝对路径,不能含~或变量,MySQL 不展开 -
log_output只能是'FILE'、'TABLE'或'FILE,TABLE';调试阶段强烈建议只用FILE
配置后必须做的三件事
否则服务可能启动失败,或日志仍不生成:
- 手动创建目录并授权:
sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql - 重启服务:
sudo systemctl restart mysqld(确认systemctl status mysqld为 active) - 立刻验证:
sudo tail -f /var/log/mysql/general.log,另开一个连接执行SELECT 1;,看是否实时出现记录
通用查询日志 IO 压力极大,QPS 稍高就可能迅速占满磁盘;它只适合短时定位连接行为、SQL 注入试探或应用初始化逻辑问题,切勿长期开启。临时启用后务必及时关闭——哪怕只是改配置重启,也要记得在下次上线前删掉这三行。


















