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

Php 写入自定义日志以及laravel 5中的laravel.log,php,laravel,logging,laravel-5,Php,Laravel,Logging,Laravel 5,我正在尝试为我的laravel应用程序编写一个自定义日志,因为该应用程序非常大,所以我想组织我的日志文件 问题是,如果应用程序在任何时候出错,它会写入laravel.log文件并终止脚本,就像php那样 例如,我有一个这样的自定义日志库 <?php namespace App\Libraries\Logs; use Monolog\Logger; use Monolog\Handler\StreamHandler; use Log; class CustomLogsLibrary

我正在尝试为我的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对象中拼写了'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);
}
不过,我有两个建议:

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

  • 使用
    app/Exceptions/Handler.php
    render方法并添加自定义日志there@rkj很抱歉你能强调一下你的意思吗?我的意思是你可以在异常处理程序渲染方法中使用你的自定义日志,路径是
    app/Exceptions/handler.php
    在那里你可以使用基于此的条件和自定义日志condition@rkj如果您有时间,可以举个例子吗?谢谢
    public function render($request, Exception $exception)
    {
       $error = (new CustomLogsLibrary)->userError($exception->getMessage());
        return parent::render($request, $exception);
    }