thinkphp 6 默认错误日志开关在 config/log.php 中,需确保 'default' => 'file'、channels.file.level 包含 'error'、'close' => false,且 runtime/log 目录可写;app_debug 仅控制页面显示,不影响日志写入。

ThinkPHP 默认错误日志开关在哪
ThinkPHP 6 默认会把错误、异常和调试信息写入 runtime/log/ 目录,但前提是日志驱动启用且错误级别匹配。关键配置在 config/log.php 中的 default 和 channels 设置,不是靠 app_debug 控制——app_debug 只影响是否显示在页面上,不影响日志写入。
常见误区是把 app_debug => false 当成“关闭所有错误输出”,其实它只是关掉浏览器报错,日志照常记录(只要日志没被禁用)。
-
log.level必须包含error或notice等对应级别,否则trigger_error()或异常不会落盘 -
log.default对应的 channel 必须存在且type不为test(test类型不写文件) - 确保
runtime/log/目录可写,否则会静默失败,连 warning 都不报
如何让 PHP 原生错误(如 notice/warning)进日志
ThinkPHP 6 默认只捕获异常(Throwable),对 E_NOTICE、E_WARNING 这类错误默认忽略,除非你显式开启错误处理器。要让它们也进日志,得在 app/common.php 或 app/bootstrap.php 里注册自定义错误处理:
set_error_handler(function ($level, $message, $file, $line) {
if (error_reporting() & $level) {
\think\facade\Log::record("PHP $level: $message in $file:$line", 'error');
}
});
注意:set_error_handler 不捕获 E_ERROR、E_PARSE 等致命错误;这类错误需靠 register_shutdown_function + error_get_last() 补充捕获。
- 别在
Log::record()里用info级别记 warning,容易被日志 level 过滤掉 - 避免在 handler 里调用可能触发新错误的代码(比如访问未初始化的容器实例)
- 如果用了 Swoole 或 Hyperf 兼容模式,
set_error_handler可能被覆盖,得确认执行时机
自定义异常处理器时怎么确保日志不丢
重写 app/exception/Handler.php 的 report() 方法是标准做法,但很多人只调 parent::report() 就以为完事了——其实 ThinkPHP 的父类 think\exception\Handle 在 report() 里只做基础记录,不保证立即刷盘,尤其在 CLI 或长连接场景下可能滞留缓冲区。
安全做法是手动触发日志写入:
public function report(Throwable $e): bool
{
\think\facade\Log::error($e->__toString());
\think\facade\Log::save(); // 强制刷盘,防止进程退出前丢失
return parent::report($e);
}
-
Log::save()是关键,否则日志可能卡在内存 buffer 里 - 不要在
report()里抛出新异常,会导致循环调用或进程崩溃 - 若启用了日志异步写入(如
type => 'single' + 'async' => true),save()无效,得换同步方式或改用队列消费
日志文件名乱码或内容为空怎么办
Windows 下常见日志文件名含中文路径(比如 runtime/log/2024-05-10.log)但内容为空,大概率是编码或权限问题;Linux 下则多见于 SELinux 或容器挂载导致的写入失败。
- 检查
runtime/log/目录的umask和属主,PHP 进程用户必须有写权限(CLI 模式常用www-data或nginx) - 日志内容为空但文件存在?可能是
log.file_size设得太小(默认2097152字节),滚动后旧文件被清空,新文件还没写满就结束了 - 用
tail -f runtime/log/*.log实时观察,比打开文件更可靠;如果完全没输出,先跑php think run启动内置服务,看是否触发日志
最隐蔽的问题:某些云函数或 Serverless 环境禁止写本地文件,此时日志配置再正确也没用,得对接云日志服务(如阿里云 SLS)或改用 stdout 输出。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











