Laravel日志不显示行和文件

时间:2016-09-09 05:56:54

标签: logging laravel-5.2

我正在记录如下:

Log::debug("test");

这是文件中的一行:

[2016-09-09 00:02:03] local.DEBUG: test

如何配置日志以写入行和文件?

由于

1 个答案:

答案 0 :(得分:1)

您实际上可以将Laravel记录器配置为执行许多操作。我以前做过,在你的情况下它会是这样的:

app('log')->getMonolog()->pushProcessor(function ($record) {
    if (array_get($record, 'level_name') === 'DEBUG') {
        // ...
    }

    return $record;
});

主要的问题是:您正在尝试附加几乎不可能与PHP保持一致的信息,即包含触发日志记录功能的代码的文件和行。在你的情况下,你使用Facade调用方法,它将解析为Laravel的日志编写器,后者又调用Monolog包,然后触发你的处理器(这是一个Closure)。试图追溯你的方式是一个愚蠢的差事。

所以,我认为你有两种方法可以轻松完成这项工作:

1)只需记录日志文件和行,将其作为context传递给日志编写者:

Log::debug('My debug message', ['file' => __FILE__, 'line' => __LINE__]);

2)您可能知道,Laravel日志中通常包含文件和行信息的原因与记录器本身无关,而是与PHP Exception的内置__toString方法有关,其输出以及堆栈跟踪。如果我们可以利用它来实现我们想要的东西怎么办?

<?php

class DebugInfo extends \Exception
{
    public function __toString()
    {
        return 'Debug info "'.$this->getMessage().'" on file '.$this->getFile().':'.$this->getLine();
    }
}

这样你就可以写:

Log::debug(new DebugInfo('My debug message'));

你的日志看起来像这样:

[2016-09-09 09:21:29] local.DEBUG: Debug info "My debug message" on file .../app/Http/Controllers/PresentationController.php:15  

作为旁注,如果您希望向自己发送消息以进行调试,我建议您尝试Laravel DebugBar package