log::error()写不进文件主因是php底层日志未开启、thinkphp日志通道未激活或app_debug=true;需配置log_errors=on、app_debug=false,并确保runtime/log目录可写且config/log.php中default='file'、close=false。

Log::error() 写不进文件,90% 不是代码问题,而是 PHP 底层错误日志没开、ThinkPHP 日志通道未激活、或 APP_DEBUG=true 拦截了整个流程。
PHP 底层 fatal error 根本不走 Log::error()
Parse error、Fatal error 这类错误连框架都没加载完,Log::error() 压根不会被执行。它们靠的是 PHP 自身的 log_errors 和 error_log 配置。
-
log_errors = On必须开启,否则任何错误都不会写日志 -
error_reporting要覆盖你想捕获的级别,生产环境推荐E_ALL & ~E_NOTICE & ~E_DEPRECATED -
error_log = /var/log/php_errors.log路径不能是 Web 可访问目录,且运行用户(如www-data)必须有写权限 - 改完 php.ini 后,必须重启
php-fpm或 Apache/Nginx,否则配置不生效 - 快速验证:执行
php -r "error_log('test', 0);",再检查日志文件是否新增内容
ThinkPHP 6+ 的 Log::error() 生效前提
框架内抛出的异常(比如数据库查询失败、手动 throw Exception)才走 Log::error(),但它是否落地,取决于三件事:APP_DEBUG 开关、config/log.php 驱动配置、runtime 目录权限。
-
APP_DEBUG = false是硬性前提——开发模式下所有错误直接打屏,日志链路被跳过 -
config/log.php中'default' => 'file'必须明确指定驱动名,不能是空字符串或'test' -
channels.file.path默认为空,会 fallback 到runtime/log/;若该目录不存在或无写权,file_put_contents静默失败,报错 “No such file or directory” -
channels.file.close = false—— 设成true会全局禁用日志,且无任何提示 - 想固定日志文件名(比如总叫
error.log),写成'path' => 'log/error.log',注意这是相对于runtime/的路径
404 错误为啥不进日志?两个开关都得打开
HTTP 404 是 think\exception\HttpException,它不归 PHP 错误系统管,也不自动进 Log::error(),得靠 ThinkPHP 的异常处理链路显式放行。
-
config/log.php中'ignore_404' => false(默认就是 false,但有人手抖改成 true) -
config/exception.php中'log' => true—— 控制所有未捕获异常是否记录,包括 404 - 如果用了自定义异常处理器,必须确保调用了
parent::report($exception),否则日志链路中断
runtime/log/ 目录权限和结构最容易被忽略
ThinkPHP 不会自动创建多级子目录。你设了 'path' => 'log/error.log',但 runtime/log/ 不存在,或者被 CI/CD 脚本清空过,file_put_contents 就直接失败。
- Linux 下确认权限:
ls -ld runtime/ runtime/log/,确保 Web 用户可写(如chmod -R 755 runtime/) - 别在
path里写动态路径(如log/{date('Ym')}/error.log),ThinkPHP 不解析 PHP 函数 - Git 项目常把
runtime/加入.gitignore,部署时需确保它被创建且结构完整 - 用
single => true可避免按日期分文件,方便监控脚本读取,但要自己确保单文件可写
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











