我在nginx后面有一个laravel应用程序,最近将php从7.1版本更新到7.3(docker image 7.1-fpm-alpine到7.3-fpm-alpine)。
我使用具有render()
函数的异常来输出错误页面。 Laravel记录异常消息并完成堆栈跟踪。
自从更新到php 7.3以来,nginx显示它的默认502错误页面并记录[error] 11#11: *61 upstream prematurely closed FastCGI stdout while reading response header from upstream, client: [...]
。 nginx中的stacktrace在2048个字节后被截断。
serverfault问题"Nginx/PHP-FPM long log lines get truncated"建议nginx仅处理不超过2048个字节的错误。
在PHP 7.1中,堆栈跟踪已被截断。
我是对的,问题是PHP现在记录了完整的堆栈跟踪,而不是将其截断了?
有没有一种方法可以截断PHP中的日志输出以返回到PHP 7.1的行为?
答案 0 :(得分:2)
默认情况下,PHP 7.3的功能应与以前的版本相同(它将截断1024个字符),但是有new configuration to allow more characters:
log_limit整数 记录行的日志限制,允许记录长度超过1024个字符的消息而无需换行。默认值:1024。自PHP 7.3.0起可用。
在使用官方Docker PHP 7.3容器时,我遇到了这个问题,该容器专门覆盖了Dockerfile
中的默认值:
echo 'log_limit = 8192';
可以通过覆盖log_limit
进行修复,使其不超过nginx的2048限制:
[global]
log_limit = 1024
答案 1 :(得分:0)
我的应用程序使用errorlog
日志驱动程序,但遇到了同样的问题。在Laravel中,我通过以下方式修改了app/Exceptions/Handler.php
(实际上,这很受您的问题启发):
public function report(Exception $exception)
{
$message = get_class($exception) . ": {$exception->getMessage()}. Trace:\n{$exception->getTraceAsString()}";
error_log(substr($message, 0, 2048));
}
substr()部分起作用了。不过,我仍然必须开发一个更好,更通用的解决方案,因为这只是快速的n-dirty解决方案。