ThinkPHP的Log门面默认仅写入runtime/log/日期目录下的log.php,且只记录框架warn/error日志,Log::info()等调用无反应是因为默认通道未配置info级别或未启用;可靠写入需用Log::channel('custom')指定已配置通道,或直接new File类写入。

Log门面默认写入的是什么日志文件
ThinkPHP 的 Log 门面(think\Log)默认只往 runtime/log/ 下的日期子目录里写 log.php,且仅记录框架内部触发的 warn/error 级别日志,**不会自动接收你用 Log::info() 这类调用写入的内容**——除非你显式配置了日志通道并指定写入行为。
为什么 Log::info('xxx') 没反应
这是最常踩的坑:门面调用本身不等于“写入磁盘”。它只是把日志推给当前默认通道(default),而这个通道默认是 File 驱动,但它的配置可能被覆盖、未启用或没设 level 白名单。
-
app.log.level配置必须包含info(默认通常是['error', 'warning', 'sql']) - 确保
app.log.file驱动已启用,且path可写(如runtime/log/) - 检查是否在中间件或配置中调用了
Log::close()或清空了通道
写入自定义日志文件的两种可靠方式
不要依赖门面全局写入,直接操作具体通道更可控。推荐以下任一做法:
方式一:用 Log::channel() 临时切换通道
立即学习“PHP免费学习笔记(深入)”;
use think\Log;
Log::channel('custom')->info('订单处理开始', ['order_id' => 123]);
前提是已在 config/log.php 中定义了 custom 通道,例如:
'custom' => [
'type' => 'File',
'path' => runtime_path() . 'log/custom/',
'level' => ['info', 'error'],
'file' => 'pay.log',
],
方式二:直接 new File 类写入(绕过门面)
use think\log\driver\File;
$logger = new File([
'path' => runtime_path() . 'log/sms/',
'file' => 'sms_' . date('Y-m-d') . '.log',
]);
$logger->info('短信发送成功', ['phone' => '138****1234']);
这种方式完全不依赖配置和门面状态,适合关键路径(如支付回调、短信日志)的强保障写入。
注意 channel 名称和配置键必须严格一致
通道名不是随便写的字符串:Log::channel('xxx') 中的 xxx 必须和 config/log.php 的顶层键名完全匹配(区分大小写),且该键下要有 type 和必要参数。常见错误包括:
- 配置里写的是
'Custom',代码里却调用Log::channel('custom') - 忘记在
log.php中把新通道加进'default'或单独声明,导致通道未注册 - 使用
Sdk类型通道时,没引入对应 SDK 包,运行时报Class not found
通道初始化失败时,Log::channel() 不报错,而是静默退化为 default 通道——这会让日志“写到别的地方去”,极难排查。



















