当报告文件路径错误时,Laravel 5.5修复了laravel.log中的换行符

问题描述 投票:2回答:2

我刚刚注意到报告错误时laravel.log中存在问题。 Laravel或Monolog在文件路径中插入回车符,因为我的应用程序目录以字母“r”开头。这是新的。我有其他应用程序以'r'开头,他们有同样的问题。我确信它有一些事情要做我的环境。我使用的是Windows 10,Laragon,Laravel 5.5,git,github和PhpStorm。

目录的名称是rli-ccm。因此,您可以看到\ rli-ccp已被替换,并且在\ routes之前插入了回车符。

[2018-01-30 10:51:10] testing.ERROR: Method [middleware] does not exist on 
view. {"exception":"[object] (BadMethodCallException(code: 0): Method 
[middleware] does not exist on view. at C:\\laragon\\www\
li-ccm\\vendor\\laravel\\framework\\src\\Illuminate\\View\\View.php:399)
[stacktrace]
#0 C:\\laragon\\www\
li-ccm\
outes>\\web.php(17): Illuminate\\View\\View->__call('middleware', Array)

不容易像这样读取日志文件。我考虑重新格式化日志,但我想先问一下。任何想法,将不胜感激。这是文件在带有行尾字符的记事本中的样子。

enter image description here

php laravel-5.5 monolog error-log
2个回答
1
投票

我遇到了或多或少同样的问题 - 在我的应用程序中我需要将所有日志条目保持为单行,但在升级laravel到5.5后monolog开始将数据写入日志文件而不替换/r/n。这是由getDefaultFormatter()中的Illuminate\Log\Writer方法引起的:

protected function getDefaultFormatter()
{
    return tap(new LineFormatter(null, null, true, true), function ($formatter) {
        $formatter->includeStacktraces();
    });
}

第三个参数代表允许换行。我的解决方案是删除上下文和消息中的所有换行符。我正在使用日志进行其他操作,所以我创建了服务提供程序来封装那些逻辑,这里是使日志条目成为一行的代码部分:

class LoggerServiceProvider extends ServiceProvider
{
    public function boot()
    {
    }

    public function register()
    {
        \Log::getMonolog()->pushProcessor(function ($record) {
            $record['context'] = $this->sanitizeContext($record['context']);
            $record['message'] = remove_line_breaks($record['message']);
            return $record;
        });
    }

    private function sanitizeContext(array $context = []): array
    {
        array_walk_recursive($context, function (&$value) {
            if (is_string($value)) {
                $value = remove_line_breaks($value);
            }
        });
        return $context;
    }
}

其中remove_line_breaks()是一个小帮手,看起来像

function remove_line_breaks(string $item): string
{
    return str_replace(["\r\n", "\r", "\n"], ' ', $item);
}

希望它会有用


0
投票

我通过编辑Monolog LineFormatter中的replaceNewline函数来修复我的问题,以执行以下操作。

protected function replaceNewlines($str)
{
    if ($this->allowInlineLineBreaks) {
        if (0 === strpos($str, '{')) {
            return str_replace(array('\r', '\n'), array("\r", "\n"), str_replace(array("\\\\"), "/", $str));
        }

        return str_replace(array("\\\\"), "/", $str);
    }

    return str_replace(array("\r\n", "\r", "\n"), ' ', str_replace(array("\\\\"), "/", $str));
}

一个更永久的修复方法是以某种方式操作异常对象上的文件和跟踪,然后再将其传递给处理程序中的parent :: report($ exception)。

© www.soinside.com 2019 - 2024. All rights reserved.