Yii日志文件默认存于@runtime/logs/目录(即./runtime/logs/),可安全删除但需确保PHP进程未占用文件,旧日志被删后会自动重建;若磁盘空间未释放,可能是进程仍持有已删文件句柄,需重启进程或用logrotate copytruncate。

Yii 日志文件存在哪里?
默认情况下,Yii 2 的日志文件写在 @runtime/logs/ 目录下,对应物理路径通常是 ./runtime/logs/(项目根目录下的 runtime 子目录)。这个位置由 'log' => ['targets' => [...]] 配置中的 file target 的 logFile 属性决定,未显式配置时走默认值:@runtime/logs/app.log 或按级别分文件(如 app.error.log)。
直接删 runtime/logs/ 下的文件安全吗?
安全,但要注意两点:
- 确保 PHP 进程(如 Web 服务器或 CLI 脚本)没有正在写入该文件——否则可能触发
fopen(): failed to open stream: Text file busy或日志丢失 - 删除后新日志会自动重建,无需重启服务,但建议在低峰期操作
- 如果用了
RotateFileTarget(默认开启),日志会按大小/天数滚动,旧文件名含时间戳,可针对性清理(如rm ./runtime/logs/app.*.log)
用 PHP 脚本自动清理日志的推荐写法
别用 exec('rm -rf runtime/logs') 这类危险命令。更稳妥的是在 Yii 命令行应用中调用 FileHelper::removeDirectory() 或遍历清理:
把这段逻辑封装成一个
yii log/clear控制台命令,比手动 rm 更可控、可审计。立即学习“PHP免费学习笔记(深入)”;
为什么有时删了日志文件,磁盘空间没立刻释放?
常见于 Linux 系统:如果某个 PHP 进程(比如常驻的 queue worker 或调试中的 long-running script)仍持有被删除文件的句柄,
lsof | grep deleted能看到类似php 12345 user 10w REG 8,1 1073741824 123456 /path/to/runtime/logs/app.log (deleted)的输出。此时文件内容仍在内存/磁盘占用,直到进程关闭该句柄。解决方法是重启对应 PHP 进程,或改用logrotate配合copytruncate模式避免此问题。











