PHP错误日志无来源信息,如何定位对应站点及获取更多错误详情?
嘿,这个问题我之前帮不少多站点运维的朋友解决过,咱们一步步来拆解排查,总能找到根源:
1. 给Web服务器日志加「站点标识」——最直接的方法
不管你用的是Apache还是Nginx,默认错误日志大概率没把站点域名写进去,咱们先改配置让日志带上关键信息:
如果你用Apache:
- 最简单的办法是给每个站点单独配错误日志,这样每个站点的错误会分开记录,再也不用混在一起找:
要是不想单独建日志文件,也可以改全局日志格式,让错误日志强制带上虚拟主机名(就是站点域名):<VirtualHost *:80> ServerName your-site.com ErrorLog /var/log/apache2/your-site.com-error.log # 其他原有配置不动 </VirtualHost>
改完记得重启Apache,之后新产生的错误日志里就会明确标出来是哪个站点的问题了。ErrorLogFormat "[%t] %v [%l] [pid %P] %F: %E: [client %a] %M"
如果你用Nginx:
- 同样,优先给每个站点单独指定错误日志:
嫌麻烦的话就改全局错误日志格式,把server { server_name your-site.com; error_log /var/log/nginx/your-site.com-error.log; # 其他原有配置不动 }$host(站点域名)加进去:
重启Nginx后,新的错误条目里就会带上对应的站点名称。log_format detailed_error '$time_local $host $remote_addr "$request" $status'; error_log /var/log/nginx/error.log detailed_error;
2. 让PHP日志吐更多细节
这个错误提示script not found:<script type="text/javascript"></script>有点奇怪——看起来像是某个请求把这段JS标签当成了要执行的脚本路径。咱们可以临时让PHP记录更完整的错误上下文:
- 找到你的php.ini,或者站点根目录的.htaccess(Apache)/fastcgi_params(Nginx),加上这些配置:
这样PHP会把触发错误的脚本路径、调用栈都记下来,你顺着路径就能找到对应的站点了。error_log = /var/log/php/php-full-error.log log_errors_max_len = 0 error_reporting = E_ALL
3. 直接查访问日志找匹配请求
错误日志里的时间是[05-Apr-2018 14:03:22 UTC],你可以去Web服务器的访问日志里找同一时间点的请求条目——访问日志里一般会有完整的请求URL、站点域名、客户端IP这些信息,直接搜<script type="text/javascript"></script>这个奇怪的路径,就能定位到是哪个站点收到了这个诡异请求:
- Apache用户可以跑这个命令:
grep '<script type="text/javascript"></script>' /var/log/apache2/access.log* - Nginx用户用这个:
grep '<script type="text/javascript"></script>' /var/log/nginx/access.log*
内容的提问来源于stack exchange,提问作者jungalist
相关产品推荐
相关产品推荐

