每个站点日志路径必须独立配置,包括Nginx/Apache的access_log/error_log及PHP应用层日志(如Monolog、Laravel logs),否则无法分别清理;需用find或logrotate按路径精准管理,并确保权限与轮转配置正确。
每个站点日志路径必须独立配置
PHP 本身不管理 Web 日志,真正写入 access.log 或 error.log 的是 Web 服务器(Nginx/Apache)。多站点共用一个日志文件就根本没法“分别清理”,所以第一步必须确认每个站点的 access_log 和 error_log 路径是否已隔离。
常见错误:所有 vhost 都指向 /var/log/nginx/access.log,脚本再怎么分站也只会删同一个文件。
- Nginx 中每个
server块里明确指定:access_log /var/log/nginx/site-a.access.log;、error_log /var/log/nginx/site-a.error.log notice; - Apache 中每个
VirtualHost内设置:CustomLog "/var/log/apache2/site-b.access.log" combined、ErrorLog "/var/log/apache2/site-b.error.log" - 确保目录可写,且 logrotate 或清理脚本有对应权限(比如属组加了
www-data)
用 find + -mtime 清理指定站点日志
不用写复杂 PHP 脚本,Linux 原生命令就能按路径+时间精准清理。关键是把日志路径当作唯一标识,而不是靠域名或配置文件名去“推断”。
例如清理 site-c 近 30 天以外的 .log 文件:
立即学习“PHP免费学习笔记(深入)”;
find /var/log/nginx/site-c.*.log -type f -mtime +30 -delete
注意点:
-
site-c.*.log可匹配site-c.access.log、site-c.error.log,也兼容 logrotate 生成的site-c.access.log.1.gz(如果后缀规则一致) - 先用
-print替代-delete预览将删哪些文件,避免误删 - 若日志被 logrotate 切割过,
-mtime看的是文件修改时间,而 .1.gz 的 mtime 是切割时刻,不是原始日志时间——这点常被忽略
用 logrotate 按站点配独立规则
比手动脚本更稳,适合生产环境。每个站点一份配置,互不影响,还能压缩、轮转、postrotate 执行额外动作(比如通知、切分分析)。