每个站点日志路径必须独立配置,包括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 执行额外动作(比如通知、切分分析)。
示例:/etc/logrotate.d/site-d
/var/log/nginx/site-d.*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
- 文件名任意,但必须放在
/etc/logrotate.d/下且无扩展名(如不能叫site-d.conf) -
sharedscripts表示所有匹配到的日志共用一次postrotate,避免每个文件都 reload nginx - 别漏掉
create权限,否则新日志可能因权限不足写失败
PHP 应用层日志(如 Monolog)也要单独配置
Web 服务器日志只是冰山一角。如果 PHP 项目自己用 Monolog、error_log() 或框架日志(Laravel 的 storage/logs/),这些路径同样得按站点拆开,否则清理时会互相污染。
典型问题:
- 多个 Laravel 站点共用同一
storage/logs/目录,清一个等于全清 -
error_log('/tmp/php_errors.log')写死路径,没按站点区分
解决方式:
- Laravel 在
.env中设LOG_CHANNEL=stack并改写config/logging.php,让dailychannel 的path包含站点标识,如storage_path('logs/site-e/laravel.log') - 自定义 Monolog Handler 时,构造
StreamHandler的第一个参数动态拼站点名,别硬编码 - 用
error_log()时,先ini_set('error_log', '/var/log/php/site-f.error.log')
路径分离这事,从 Nginx 配置开始,到 PHP 日志落地结束,中间任何一环混用都会让“分别清理”失效。最容易被跳过的其实是 PHP 层日志路径——因为 Web 服务器日志显眼,而应用日志藏在代码里,一疏忽就全站共享一个文件。











