ThinkPHP默认日志路径通过config/log.php中default通道的path配置项修改,需设为绝对路径并确保写权限,多通道可独立配置path,改后需清除runtime/cache缓存。

ThinkPHP 日志通道配置在哪改
默认日志路径在 runtime/log/,但不是靠改文件路径字符串实现的,而是通过日志通道(channel)的配置驱动。核心入口是 config/log.php 文件里的 default 通道定义,或自定义通道的 path 选项。
常见错误是直接去改 think\log\driver\File 类内部硬编码,这不可维护,且升级后会被覆盖。
- 修改位置:项目根目录下的
config/log.php - 关键配置项是
'channels' => ['default' => [...]]里的'path' - 如果用了多通道(比如单独记录 SQL 日志),每个通道都可独立设
path
修改 default 通道的 path 配置示例
打开 config/log.php,找到 'default' 通道配置块,在其数组中添加或修改 'path':
'default' => [
'type' => 'File',
'path' => '/var/log/thinkphp/', // ← 改这里,注意末尾斜杠
'level' => [],
],
注意:path 值必须是**绝对路径**,且 PHP 进程要有写权限;相对路径(如 '../logs/')容易因 CLI/Web 执行目录不同而失效。
立即学习“PHP免费学习笔记(深入)”;
- 推荐用
env('LOG_PATH', runtime_path() . 'log' . DIRECTORY_SEPARATOR)方式动态构造,更健壮 - 改完记得清空
runtime/cache/,否则配置可能不生效 - 如果日志完全不生成,先检查该目录是否存在、是否可写,而不是怀疑配置没加载
为什么改了 config/log.php 还不生效
ThinkPHP 6+ 的日志系统启动早于应用初始化,config/log.php 是被框架自动加载的,但有两个常见干扰点:
-
App::init()之前调用Log::init()会绕过配置,导致自定义设置被忽略 - 命令行模式下,
think命令启动时可能读取的是config/console.php中的log配置,而非主log.php - 某些扩展(如 think-swoole)会接管日志驱动,此时需在对应扩展配置里设
log.path
验证方式:在控制器里打印 Log::getChannel('default')->getConfig(),看 path 是否是你设的值。
自定义通道 + 多路径分离的实际写法
比如把 SQL 日志单独存到 /data/logs/sql/,不和普通日志混在一起:
'sql' => [
'type' => 'File',
'path' => '/data/logs/sql/',
'level' => ['sql'],
'file_size' => 1024 * 1024 * 10, // 10MB
],
然后在数据库配置里指定日志通道:'log' => ['channel' => 'sql']。这样 Db::query() 的 SQL 日志就只走这个通道。
- 多个通道之间完全隔离,互不影响
-
path不支持变量插值(如{date}),日期分割靠file驱动内置逻辑,无需手动拼接 - Windows 下路径分隔符用
DIRECTORY_SEPARATOR更稳妥,避免反斜杠转义问题
真正麻烦的不是改路径,而是确保所有运行环境(开发、测试、生产)的路径权限和磁盘空间一致——这点常被跳过,直到某天日志突然停写才排查。


















