ThinkPHP6日志需.env与config/log.php协同配置:APP_DEBUG=false是日志落盘前提,LOG_CHANNEL=file指定通道,RUNTIME_PATH定义运行时根目录;config/log.php中须定义对应通道、path可写、close=false、single/realtime_write按需设置;404和SQL日志需额外开启。

ThinkPHP6 的日志通道不能仅靠 .env 文件直接配置完整,但关键开关和基础路径可由 .env 控制,其余必须在 config/log.php 中配合生效。核心是:环境变量只负责“启用开关”和“基础路径覆盖”,不替代通道定义。
必须在 .env 中设置的三项
APP_DEBUG=false(生产环境强制)
这是日志落盘的前提——只有该值为 false,框架才会注册错误捕获钩子,404、异常、Fatal Error 才可能进入日志流程。若为 true,错误直接输出到页面,runtime/log/ 几乎为空。
LOG_CHANNEL=file(指定默认通道)
对应 config/log.php 中 'default' => env('log.channel', 'file')。设为 file 表示走文件通道;也可设为 email、monolog 等,前提是 config/log.php 已定义对应通道。
RUNTIME_PATH=../runtime/(可选,用于统一运行时根目录)
影响所有 runtime 下子目录(包括 log)。若修改了 runtime 根路径,channels.file.path 中的相对路径会基于此计算,避免硬编码绝对路径。
config/log.php 中需同步确认的通道配置
通道名称必须与 .env 中 LOG_CHANNEL 一致
例如 .env 设 LOG_CHANNEL=file,则 config/log.php 的 'channels' 数组里必须存在 'file' => [...] 配置块。
path 必须显式可写且存在
- 若留空:'path' => '',会 fallback 到 runtime/log/,但该目录需手动创建并赋权(如 chmod -R 755 runtime/);
- 若自定义:'path' => 'log/app.log',表示写入 runtime/log/app.log,注意是相对于 RUNTIME_PATH,不是网站根目录;
- 切勿写成 'path' => '/var/log/myapp/' 这类绝对路径——ThinkPHP 不自动创建多级目录,静默失败。
close 和 single 是关键开关
- 'close' => false:全局禁用日志,务必关掉;
- 'single' => true:关闭按日期分文件,所有日志写入单个文件(如 runtime/log/error.log),适合监控脚本读取;
- 'realtime_write' => true:出错后立即写入,避免因 exit 或异常中断导致日志丢失。
404 和 SQL 日志要额外开启
404 默认不记录?检查两个地方
- config/log.php 中 'ignore_404' => false(默认即为 false,但易被误改);
- config/exception.php 中 'log' => true,确保未捕获异常(含 HttpException)触发日志写入。
SQL 日志需单独授权
- 'level' => ['sql'] 仅控制是否记录 SQL;
- 还需在数据库配置中开启调试:'deploy' => 0 且 'debug' => true(见 config/database.php),否则 SQL 不会被捕获。
验证是否生效的快速方法
在控制器中写一行测试日志:Log::error('env log test at ' . date('Y-m-d H:i:s'));
然后检查:
- runtime/log/ 目录下是否有新文件生成;
- 文件内容是否包含刚写的字符串;
- 若无,先运行 php -r "var_dump(is_writable('runtime/log'));" 确认权限;
- 再检查 APP_DEBUG 是否真为 false(var_dump(env('app_debug')),注意无空格无引号)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











