thinkphp不支持按二级域名自动切分日志,需通过独立runtime目录或动态path实现物理隔离;共用代码时可基于http_host配置log.path,或多通道按业务分类;web服务器与php错误日志也须单独配置。

ThinkPHP 本身不直接支持按二级域名自动切分日志文件。所谓“二级域名后日志记录混乱”,本质是多个子站共用同一套 ThinkPHP 日志配置(尤其是 runtime/log/ 目录),导致日志混写、排查困难。解决思路不是让框架“识别域名”,而是通过物理隔离日志路径 + 环境/通道区分来实现真正独立。
明确日志归属:用不同 runtime 目录隔离
最稳妥的方式是为每个二级域名应用分配独立的 runtime 目录,从根本上避免文件冲突:
- 在 Web 服务器(Nginx/Apache)配置中,为每个二级域名设置不同的
root或alias,并指向各自独立的应用目录(如/var/www/app-a/、/var/www/app-b/) - 确保每个应用目录下都有独立的
runtime/子目录,且权限可写(chmod -R 755 runtime) - 不要复用同一份 ThinkPHP 源码和 runtime —— 即使代码相同,运行时数据必须分离
同一套代码多域名?改 config/log.php 的 path
若因部署限制必须共用一份代码(例如通过 server_name 匹配不同域名但入口统一),则需动态生成日志路径:
- 在
config/log.php中,将'path' => ''改为基于域名的路径,例如:
'path' => 'log/' . str_replace('.', '_', $_SERVER['HTTP_HOST']) . '/' - 注意:ThinkPHP 不会自动创建多级目录,所以部署前要手动建好
runtime/log/app_a_com/、runtime/log/app_b_com/等目录 - 该方式依赖
$_SERVER['HTTP_HOST'],需确保反向代理已透传 Host 头(如 Nginx 配置含proxy_set_header Host $host;)
用 channel 实现逻辑分流(适合分类而非域名)
如果只是想把登录、支付、API 等行为分开记录,与域名无关,可用多通道配置:
- 在
config/log.php的'channels'中定义多个 file 通道,如'login'、'pay' - 每个通道指定不同
'path',例如:'path' => 'log/login.log'和'path' => 'log/pay.log' - 代码中调用
Log::channel('login')->info(...)即写入对应文件 - 注意:这不能替代域名隔离,仅用于业务维度归类
别忽略 PHP 层和 Web 服务器层日志
ThinkPHP 日志只管框架内异常和业务日志,真正的 500、404、SSL 错误等仍由底层决定:
- Apache/Nginx 虚拟主机配置中,每个二级域名必须单独配置
ErrorLog和CustomLog,路径互不重叠 - PHP 自身错误(Fatal Error、Parse Error)由
php.ini的error_log控制,也应为每个域名设独立路径,例如:error_log = /var/log/php/app-a-error.log - 检查
APP_DEBUG=false是否已在每个环境的.env中正确设置,否则错误不会落盘
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











