排查WSL2环境下Laravel 8项目日志莫名被重复填充的问题
看起来你遇到了挺闹心的问题——明明Docker服务都关停了,Laravel的日志文件还在不停被相同的数据库错误填满,而且找不到到底是什么在触发对吧?咱们一步步来揪出这个“幕后黑手”:
第一步:定位正在写入日志的进程
既然日志文件在WSL2的Ubuntu系统里,咱们可以用lsof命令直接找出哪个进程在访问这个日志文件:
- 先确保安装了
lsof(如果没装的话,执行sudo apt update && sudo apt install lsof) - 运行命令:
lsof /path/to/your/project/storage/logs/laravel.log
这个命令会列出所有正在读写该日志的进程,重点看PID列的进程ID。
3. 接着用PID查看进程详情:
ps aux | grep [你的PID]
通过这个命令你就能看到到底是哪个程序在搞事情——比如残留的PHP进程、Laravel队列Worker、定时任务脚本,甚至是IDE的后台进程都有可能。
第二步:结合错误栈分析触发点
从你贴的错误栈能看到,问题出在AppServiceProvider.php的第32行,调用了Model::all()(应该是Category::all()吧?),而且是在服务提供者的boot方法里。这意味着每次Laravel应用启动时,这个代码都会执行,所以肯定有某个进程在反复启动你的Laravel应用。
第三步:重点排查几个常见嫌疑对象
1. 定时任务(Cron)
WSL2里的Cron服务可能独立于Docker运行,如果你之前给Laravel配置过定时任务,比如设置了每分钟执行php artisan schedule:run,那即使Docker关了,Cron还是会按时触发这个命令,此时数据库容器没启动,自然就会抛出连接错误。
- 先查看当前用户的Cron任务:
crontab -e - 如果确实有Laravel的定时任务,先临时停掉Cron服务试试:
sudo service cron stop,然后观察日志是否还在增长。
2. 残留的Laravel进程
比如之前启动的队列Worker(php artisan queue:work),可能在Docker关停后没被正常终止,一直在后台反复尝试连接数据库。
- 用命令列出所有PHP进程:
ps aux | grep php - 如果看到带有
artisan queue:work或者其他Laravel命令的进程,直接用kill [PID]杀掉,再看日志情况。
3. IDE或代码分析工具
有些IDE(比如PHPStorm)会在后台自动运行PHP代码做语法检查、代码分析或者实时预览,这可能会触发Laravel应用启动,进而执行AppServiceProvider里的代码。
- 可以暂时关闭IDE,或者禁用IDE里的Laravel相关自动检测功能,看看日志是否停止增长。
4. 其他后台服务
虽然你说本地Apache没激活,但可以再确认下WSL里有没有其他服务在运行,比如Nginx、PHP-FPM等:
- 运行
sudo service --status-all查看所有服务状态,把可疑的服务临时关停试试。
最后验证
找到可疑进程并处理后,等几分钟看看日志是否还会新增错误。如果停止了,那就是这个进程在搞鬼;如果还在增长,再回到第一步重新排查进程,可能还有漏网之鱼。
备注:内容来源于stack exchange,提问作者yossi

