最稳妥方式是启用宝塔内置日志切割功能,它开箱即用、无需脚本;但需确保站点日志路径为带域名的独立绝对路径(如/www/wwwlogs/example.com.log),并注意其不压缩、保留天数固定为30天且不可按站点单独调整。

宝塔面板里设置网站日志自动切割,最稳妥的方式是启用内置日志切割功能——它开箱即用、无需写脚本、也不依赖你对 logrotate 的熟悉程度。但要注意:这个功能只对「已配置为独立日志路径」的站点生效,且默认不压缩、保留天数固定为 30 天,不能按站点单独调。
确认日志路径是否为独立路径
如果所有站点日志都混在 /www/wwwlogs/ 下,比如 example.com.log 和 api.example.com.log 并列存在,那内置切割能识别并处理;但如果用了通配路径(如 /www/wwwlogs/*.log)或没指定域名前缀,面板可能无法准确匹配目标文件。
- 进「网站 → 设置 → 网站日志」,点击右上角「配置文件」按钮
- 检查
access_log和error_log指令是否指向带域名的绝对路径,例如:access_log /www/wwwlogs/example.com.log; - 若路径是
logs/access.log(相对路径)或/www/wwwlogs/access.log(无域名),需手动改成带域名的路径,并创建对应目录 - 改完后点「重载配置」,否则 Nginx 不会写入新路径
启用并调整内置日志切割
宝塔的「日志切割」计划任务本质是调用一个封装好的 Python 脚本,它会扫描所有启用该功能的站点,按配置移动并重命名日志文件,但不会触发 kill -USR1,也不会压缩。
- 进入「网站 → 设置 → 日志」选项卡,勾选「启用日志切割」
- 切割周期默认为「每天」,不可改为每小时或每周——这是硬限制
- 保留天数不能直接在这里改,它由全局计划任务决定;若要调为 7 天,得去「计划任务」里找「Nginx 日志切割」任务,把命令里的
--keep-days=30改成--keep-days=7 - 保存后,系统会在
/www/wwwlogs/history_backups/下生成带日期后缀的归档目录,如example.com/20260908_access.log
为什么切完日志磁盘空间没变?
常见现象:日志文件明明被移走了,df -h 显示磁盘还是 95%+。大概率是 Nginx 还在往已被 unlink 的旧文件句柄里写数据——也就是文件删了但 inode 没释放。
- 执行
lsof +L1 | grep wwwlogs,看是否有(deleted)标记的行 - 若有,说明日志被删但进程未重新打开文件;此时临时解决是
systemctl restart nginx - 长期解法是启用「日志切割」的同时,确保
postrotate阶段发送kill -USR1信号——这需要手动配置logrotate,内置功能做不到 - 别用
rm -f /www/wwwlogs/*.log清理,那只会让问题更糟
真正可控的日志切割,最终还是要落到 logrotate 配置上:它能压缩、能精准发信号、能分路径控制。但如果你只是想快速止血,内置切割 + 调整保留天数 + 定期检查 lsof +L1 就够用了——复杂点在于 Nginx 不会自己重建日志文件,信号必须手动送出去。











