在Laravel 5中写入自定义日志以及laravel.log

时间:2018-07-18 10:41:47

标签: php laravel logging laravel-5

我正在尝试为laravel应用程序编写一个自定义日志,因为该应用程序非常大,所以我想组织我的日志文件。

问题是,如果在任何时候应用程序出错,它都会像php一样写入laravel.log文件并杀死该脚本。

例如,我有一个像这样的自定义日志库

<?php

namespace App\Libraries\Logs;

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

use Log;

class CustomLogsLibrary {

    public function userError($error){

        $orderLog = new Logger('users');
        $orderLog->pushHandler(new StreamHandler(storage_path('logs/users.log')), Logger::INFO);
        $orderLog->info('Error 1', $error);

    }

}

然后如果这是我的脚本

    $user = new User;
    $user->nae = $request->name; //Name spelt wrong on purpose
    $user->email = $request->email;
    $user->password = bcrypt($request->password);
    if(!$user->save()){
        $errorCode = (new CustomLogsLibrary)->userError($user->save()); 
    }

您可能会看到,我在用户对象中拼错了“名称”,从而导致错误。

Laravel随后在拼写错误的名称和死亡上出错,这意味着它实际上从未到达我的自定义日志功能,而是记录了日志

  

找不到列:1054“字段列表”中的未知列“ nme”

laravel.log,然后死亡。我知道如果返回false,它将击中函数,但是当不返回false且由于其他原因导致函数错误时,我仍然想将其记录在自定义文件中。

我该如何解决?

我希望能够将所有错误整理到单独的文件中,并优先于标准laravel.log文件写入这些文件。

1 个答案:

答案 0 :(得分:0)

您需要在位于render()的Laravel Handler类的app/Exceptions/Handler.php方法中添加自定义记录器。

类似这样的事情应该可以解决:

public function render($request, Exception $exception)
{
   $error = (new CustomLogsLibrary)->userError($exception->getMessage());
    return parent::render($request, $exception);
}

我确实有2条建议:

  1. 将您的自定义日志方法设为静态,以便您无需每次实例化新对象就可以调用它;在这种情况下,没有理由认为该特定方法不是静态的,因为它不依赖于该类的任何其他变量/方法,并且是完全独立的。用法将是这样的:CustomLogsLibrary::userError('Error message')
  2. 高度并没有让您的应用程序那样失败,我建议您将代码包装在try-catch块中。您可以更好地控制try-catch内的失败情况,并且可以更好地控制用户体验,而不仅仅是将其发送到丑陋的错误页面。