Laravel 日志事件

标签 laravel laravel-5.1 monolog

Laravel 5.1 是否广播您可以监听的任何日志事件?例如,如果创建日志条目并将其保存到日志文件中,它是否提供将插入日志中的信息?我找不到有关该主题的任何信息,因此任何帮助都会很棒,谢谢!

编辑:

搜索了 Laravel 日志编写器源代码。发现名为 Illuminate.log 的所有日志事件都会触发一个事件,然后由编写器捕获。

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

当抛出异常时,会创建一个日志条目,但发生这种情况时似乎并未调度事件。只有当您显式调用日志时才会调度事件。例如,其输出为日志已写入:

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 日志编写器添加独白处理程序最终成为此处的方法。我使用以下内容创建了一个 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 文件中。

关于Laravel 日志事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32230089/

相关文章:

php - 在失败的 gelf 连接上使用 Symfony 2/Monolog 防止内部服务器错误

css - 使用 vuejs 和 laravel 消除导航栏和旋转木马之间的差距

php - 禁用缓存?

带有时间戳的 Laravel 5.1 eloquent::attach() 方法

php - Symfony 2 中默认独白的自定义独白处理程序

php - 日志中时间戳的时区?

php - 如何在 Laravel Blade 模板中显示上传的图像?

php - Laravel eloquent - 防止连接表时覆盖值

javascript - Axios POST 在 iOS 上失败

用于 chart.js 数据的 Laravel 5.1 格式日期数组