Laravel测试环境设置LOG_CHANNEL=null报错问题排查
解决Laravel测试环境设置LOG_CHANNEL=null时报错的问题
问题重现
配置了三个测试环境.env文件:
.env.testing:单元/功能测试.env.dusk.local:本地Dusk测试.env.dusk.testing:CI/CD Dusk测试
为避免测试生成日志,将这些文件中的日志变量设置为:
LOG_CHANNEL=null
运行Dusk测试时触发错误:
[2023-10-26 18:38:28] laravel.EMERGENCY: Unable to create configured logger. Using emergency logger. {"exception":"[object] (InvalidArgumentException(code: 0): Log [] is not defined. at D:\Path\To\Site\mysite\vendor\laravel\framework\src\Illuminate\Log\LogManager.php:210) [stacktrace] ...
已在config/logging.php中配置null通道:
'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ],
且执行过php artisan optimize:clear清除配置缓存,近期通过Laravel Shift升级到Laravel 9。
问题原因
当在.env文件中直接写LOG_CHANNEL=null时,Laravel会将其解析为空字符串,而非字符串"null",导致LogManager无法找到对应的日志通道配置,从而抛出"Log [] is not defined"的错误。
解决方案
方案1:将环境变量值用引号包裹
修改.env测试文件中的配置为:
LOG_CHANNEL="null"
这样Laravel会正确识别该值为字符串"null",匹配你在config/logging.php中定义的null通道。
方案2:直接在测试环境配置文件中硬编码
如果不想依赖.env变量,可以在测试环境的日志配置文件中直接指定默认通道。比如创建config/env/testing/logging.php(Laravel 9支持环境专属配置目录),内容如下:
<?php use Monolog\Handler\NullHandler; return [ 'default' => 'null', 'channels' => [ 'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], // 保留其他必要通道配置 ], ];
方案3:确认NullHandler的引入
检查config/logging.php顶部是否正确引入了NullHandler类:
use Monolog\Handler\NullHandler;
如果缺少这个引入,也会导致无法初始化null通道。
验证步骤
修改配置后,重新执行:
php artisan optimize:clear
然后再次运行Dusk测试,错误应该会消失,测试过程也不会生成日志文件。
内容的提问来源于stack exchange,提问作者Hashim Aziz
相关产品推荐
相关产品推荐

