Laravel 记录事件

Laravel Log Events

Laravel 5.1 是否广播任何您可以收听的日志记录事件?例如,如果创建了一个日志条目并将其保存到日志文件中,它是否提供了将要插入到日志中的信息?我找不到关于该主题的任何信息,所以任何帮助都会很好,谢谢!

编辑:

通过 Laravel 日志编写器源进行了搜索。发现所有名为 illuminate.log 的日志事件都会触发一个事件,然后由作者捕获。

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Log/Writer.php#L295

当抛出异常时,会创建一个日志条目,但是当发生这种情况时似乎没有调度事件。只有当您显式调用日志时,事件才会被调度。例如,它的输出是 Log was written to:

Route::get('/', function () {

    Event::listen('illuminate.log', function()
    {
        die('Log was written to');
    });

    Log::info('info');

    throw new Exception('Exception');
});

然而,这只是显示异常:

Route::get('/', function () {

    Event::listen('illuminate.log', function()
    {
        die('Log was written to');
    });

    throw new Exception('Exception');
});

我不确定这是否是一个错误?我猜不会,如果是这样的话,有人对此有任何建议吗?我只需要在写入日志时捕捉并保存信息。

通过 laravel 日志编写器添加 monolog 处理程序最终成为这里的方法。我用以下内容创建了一个 LoggerServiceProvider

namespace App\Providers;

use Monolog\Logger;
use Illuminate\Log\Writer;
use Illuminate\Support\ServiceProvider;

class LoggerServiceProvider extends ServiceProvider
{
    /**
     * Push the eloquent handler to monolog on boot.
     */
    public function boot()
    {
        $logger = app('log');

        // Make sure the logger is a Writer instance
        if($logger instanceof Writer) {
            $monolog = $logger->getMonolog();

            // Make sure the Monolog Logger is returned
            if($monolog instanceof Logger) {
                // Create your custom handler
                $handler = new App\Handlers\MyCustomHandler();

                // Push it to monolog
                $monolog->pushHandler($handler);
            }
        }
    }

    /**
     * Register bindings in the container.
     */
    public function register()
    {
        //
    }
}

我建议像这样扩展 Monologs AbstractHandler

namespace App\Handlers\MyCustomHandler;

use Monolog\Handler\AbstractHandler;

class MyCustomHandler extends AbstractHandler
{
    /**
     * Handle the log record.
     *
     * @param array $record
     *
     * @return bool
     */
    public function handle(array $record = [])
    {
        // Do something with the $record array
    }
}

然后在您的 config/app.php 文件中插入您的新服务提供商。

如果异常没有处理这个,那么我建议将记录器子类化,并覆盖 writeLog 方法来处理所有日志操作,然后 parent::writeLog() 保持日志记录.

然后在应用程序容器中使用 logPsr\Log\LoggerInterfaceIlluminate\Contracts\Logging\Log 键进行注册。