日志路径必须在config/log.php中通过通道path配置项设置,不可硬编码或改文件系统路径;需用绝对路径且末尾带斜杠,配置后清空runtime/cache并确保目录存在、PHP进程有写权限。

日志路径必须通过 config/log.php 中的通道 path 配置项设置,不能直接改文件系统路径或硬编码到驱动类里——否则升级就丢,且 CLI 和 Web 环境行为不一致。
config/log.php 里改 default 通道的 path
打开项目根目录下的 config/log.php,找到 'default' 通道配置块,在其数组中添加或修改 path:
'default' => [
'type' => 'File',
'path' => '/var/log/myapp/', // ← 必须是绝对路径,末尾带斜杠
'level' => [],
],-
path值不能是相对路径(如../logs/或runtime/log/),因为 CLI 模式下工作目录不同,会写错位置 - 推荐用
env('LOG_PATH', runtime_path() . 'log' . DIRECTORY_SEPARATOR)动态构造,兼顾环境变量与默认 fallback - 改完必须清空
runtime/cache/,否则框架可能仍读缓存配置 - 目录需提前存在,且 PHP 进程用户(如
www-data)有写权限;静默失败时不会报错,只不生成日志
多通道场景下各通道独立配 path
比如把 SQL 日志单独存到 /data/logs/sql/,和普通日志物理隔离:
'sql' => [
'type' => 'File',
'path' => '/data/logs/sql/', // ← 各通道 path 互不影响
'level' => ['sql'],
'file_size'=> 1024 * 1024 * 10,
],- 数据库配置里要显式指定通道:
'log' => ['channel' => 'sql'],否则Db::query()还是走 default -
path值末尾必须有斜杠,否则 ThinkPHP 会错误拼成/data/logs/sql_sql.log - 用
runtime_path() . 'log/pay/'这种拼接方式时,注意runtime_path()已含末尾/,别重复加
命令行模式下日志路径容易被忽略
执行 php think xxx 时,日志可能不走 config/log.php,而是受 config/console.php 或命令内动态配置影响:
立即学习“PHP免费学习笔记(深入)”;
- 检查
config/console.php是否定义了log配置项,它会覆盖主日志配置 - 在自定义命令类中,可通过
$input->getOption('log-path')动态传入路径,并调用config(['log.channels.default.path' => $path])覆盖 - 务必手动创建目标目录并设好权限:
mkdir -p /var/log/myapp && chown www-data:www-data /var/log/myapp - 验证是否生效:在命令中执行
Log::getChannel('default')->getConfig()['path'],看输出是否为你设的值
最常被跳过的一步是权限校验——路径写对了、配置也重载了,但 is_writable('/var/log/myapp') 返回 false,日志就彻底静默消失。上线前务必用脚本主动检测,别等出问题再翻日志目录是否存在。



















