宝塔面板日志轮转需依赖系统logrotate,非面板内置;须手动配置/etc/logrotate.d/规则并确保权限、路径正确,启用logrotate.timer,且mysql慢日志等需配合usr1信号重载。

宝塔面板日志轮转没生效?检查 logrotate 配置路径和权限
宝塔本身不内置 logrotate,它依赖系统级的 /etc/logrotate.d/ 规则。很多人以为在面板里点“日志切割”就万事大吉,结果发现 /var/log/journal 或 /www/wwwlogs/xxx.log 依然疯长——问题常出在 logrotate 没被正确触发,或配置文件压根没写对路径。
- 先确认 logrotate 是否真在运行:
sudo systemctl status logrotate.timer,若显示 inactive,需启用:sudo systemctl enable --now logrotate.timer - 检查宝塔站点日志是否被纳入轮转:默认不会自动加入,得手动创建配置,比如
/etc/logrotate.d/bt-site,内容必须严格匹配日志实际路径,例如:/www/wwwlogs/*.log { daily rotate 10 compress missingok notifempty create 640 www www } -
create 640 www www这行不能少,否则轮转后新日志因权限不对写不进去,Nginx/Apache 会报错open() "/www/wwwlogs/xxx.log" failed (13: Permission denied) - 测试配置是否语法合法:
sudo logrotate -d /etc/logrotate.d/bt-site(-d是 debug 模式,不真正执行)
宝塔计划任务里的“日志切割”功能到底切什么?
这个功能只处理宝塔面板识别为“网站日志”的文件,即 /www/wwwlogs/域名.log 和 /www/wwwlogs/域名.error.log,且仅支持按天切割、保留份数,**不处理 Nginx 自身的 access.log 或 error.log(如果它们被重定向到别处),也不管 /var/log/ 下任何系统日志。
- 它本质是调用宝塔内部脚本执行
mv + gzip + touch,不是 logrotate,所以无法限制单个文件大小,也不能压缩旧日志时延迟删除原始文件(delaycompress) - 如果你在站点设置里关了“记录访问日志”,那这个切割任务就完全无效——它切的是“已开启日志记录”的站点
- 执行时间固定在每天 00:30,不可修改;若服务器在那个时刻离线,当天切割就会跳过,不会补执行
- 建议只对高流量正式站启用,测试站直接关日志更省事:
记录访问日志和记录错误日志全部取消勾选
systemd-journald 占几 GB?journalctl 的配额必须手动设
宝塔面板服务(bt)、MySQL、Nginx 等只要用 systemd 启动,其 stdout/stderr 默认全被 journald 捕获。默认无上限,/var/log/journal/ 几个月就能涨到 5–10 GB,而宝塔面板的“日志清理工具”对此完全无感。
- 查当前占用:
journalctl --disk-usage,常见输出如Archived and active journals take up 6.2G in the file system. - 永久限制大小(推荐 500M):
sudo mkdir -p /etc/systemd/journald.conf.d,然后写入/etc/systemd/journald.conf.d/limit.conf:[Journal] SystemMaxUse=500M RuntimeMaxUse=500M
- 生效需重启 journald:
sudo systemctl restart systemd-journald,再执行sudo journalctl --vacuum-size=500M立即清理超限部分 - 注意:
vacuum-size是一次性操作,SystemMaxUse才是长期生效的硬限制;不设的话,journald 会按磁盘总容量的 10% 自动分配,服务器磁盘大,它就敢占更多
MySQL 慢查询日志爆满?别只删文件,要关开关或设轮转
慢查询日志(slow_query_log_file)一旦开启,MySQL 就持续追加写入,文件只增不减。单纯 rm -f 删除后,MySQL 可能因文件句柄未释放继续往已删文件写(表现为磁盘空间不释放),或者重启后新建空文件但权限不对导致服务起不来。
- 最稳妥做法:进宝塔【数据库】→【MySQL 管理】→【配置修改】,把
slow_query_log设为OFF,再点【重载配置】,等服务应用后,再手动删日志文件 - 若必须保留慢日志,优先用
logrotate而非 MySQL 内置轮转(log_rotation = ON仅 MySQL 8.0.14+ 支持,且宝塔界面不暴露该参数) - logrotate 配置示例(
/etc/logrotate.d/mysql-slow):/www/server/data/mysql-slow.log { daily rotate 7 compress missingok notifempty create 640 mysql mysql sharedscripts postrotate /bin/kill -USR1 `cat /www/server/data/mysql.pid 2>/dev/null` 2>/dev/null || true endscript }其中postrotate发送USR1信号通知 MySQL 重新打开日志文件,避免句柄残留
日志清理最易被忽略的点:不是“怎么删”,而是“删完谁来写新日志、用什么权限写、写到哪儿”。路径写错、权限没设、信号没发,都会导致服务静默失败或日志重新开始疯长。动手前,先 ls -l 看一眼目标文件属主和权限,比盲目执行命令安全得多。










