繁体   English   中英

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

[英]Writing to custom log aswell as laravel.log in laravel 5

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

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

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

<?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()); 
    }

你可能会看到我在用户对象中拼错了'name'以强制出错。

然后Laravel错误的拼写错误名称和死亡,这意味着它永远不会实际到达我的自定义日志功能,而是记录

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

laravel.log然后死了。 我知道如果返回false会触发该函数,但是如果没有返回false并且函数出错的原因不同,我仍然希望将其记录在自定义文件中。

我该如何解决这个问题?

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

您需要在位于此处的Laravel的Handler类的render()方法中添加自定义记录器: 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内部的故障情况,并且可以更好地控制用户体验,而不是仅仅将它们发送到丑陋的错误页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM