如何在laravel 5.7中添加身份验证用户ID或会话?

时间:2018-12-11 03:18:44

标签: laravel laravel-5 monolog

我的目标

我愿意将当前经过身份验证的用户ID作为自定义日志格式添加到日志行(我正在使用syslog驱动程序)。

作为研究的一部分,我发现有不错的软件包和tutorials可以将用户活动记录到数据库中。但是至少到目前为止,我的意图是继续前进,而不需要额外的程序包,并像我目前所做的那样登录到 syslog

我的应用程序中的典型日志调用如下:

logger()->info("Listing all items");

我还可以做类似的事情:

$uid = Auth::id();
logger()->info("Listing all items for {$uid}");

这与文档示例所建议的类似:

Docs Example

我目前正在某些行中执行此操作,但是由于我希望在所有日志调用中都进行此操作,因此就像我每次记录某些内容时重复自己一样。

所需的输出

当前:

Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO: Hello world []

所需:

Dec 10 23:54:05 trinsic Laravel[13606]: local.INFO [AUTH_USER_ID=2452]: Hello world []

我的方法

我尝试成功地点击记录器,成功更改了as suggested on docs格式。

但是我当前的问题是在执行CustomizeFormatter类的那一点上,Auth ID似乎还没有解决(对此不确定(但是不确定,但是dd()返回null,所以这是我的猜):

<?php

namespace App\Logging;

use Illuminate\Support\Facades\Auth;
use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        $authUser = Auth::id(); // null

        foreach ($logger->getHandlers() as $handler) {
            $formatter = new LineFormatter("%channel%.%level_name% [AUTH={$authUser}]: %message% %extra%");
            $handler->setFormatter($formatter);
        }
    }
}

设置

Laravel 5.7 日志驱动程序:syslog

    // config/logging.php

    'syslog' => [
        'driver' => 'syslog',
        'tap' => [ App\Logging\CustomizeFormatter::class ],
        'level' => 'debug',
    ],

我的问题

  • 此时是否有任何方法可以解析auth用户,或者有其他方法可以实现此目的?

2 个答案:

答案 0 :(得分:1)

尝试将请求对象作为构造函数arg传递到您的自定义格式化程序类,然后从那里访问用户:

<?php

namespace App\Logging;

use Illuminate\Support\Facades\Auth;
use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        $authUser = $this->request->user();
        foreach ($logger->getHandlers() as $handler) {
            $formatter = new LineFormatter("%channel%.%level_name% [AUTH={$authUser->id}]: %message% %extra%");
            $handler->setFormatter($formatter);
        }
    }
}

答案 1 :(得分:0)

基于 DigitalDrifter 的答案和this post from Emir Karşıyakalı的一部分,我设法获得了足够公平的解决方案。

我无法抓住用户ID,因为(据我目前的理解)尚无法解决。但是我对获得或多或少准确的客户端ID和会话ID感到满意,因此我可以在日志上跟踪用户交互线程:

<?php

namespace App\Loggers;

use Monolog\Formatter\LineFormatter;

class LocalLogger
{
    private $request;

    public function __construct(\Illuminate\Http\Request $request)
    {
        $this->request = $request;
    }

    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter($this->getLogFormatter());
        }
    }

    protected function getLogFormatter()
    {
        $uniqueClientId = $this->getUniqueClientId();

        $format = str_replace(
            '[%datetime%] ',
            sprintf('[%%datetime%%] %s ', $uniqueClientId),
            LineFormatter::SIMPLE_FORMAT
        );

        return new LineFormatter($format, null, true, true);
    }

    protected function getUniqueClientId()
    {
        $clientId = md5($this->request->server('HTTP_USER_AGENT').'/'.$this->request->ip());
        $sessionId = \Session::getId();

        return "[{$clientId}:{$sessionId}]";
    }
}

配置:

    // config/logger.php

    'syslog' => [
        'driver' => 'syslog',
        'level'  => 'debug',
        'tap'    => [App\Loggers\LocalLogger::class],
    ],

结果

现在我可以得到类似的东西了

Dec 11 13:54:13 trinsic Fimedi[13390]: [2018-12-11 16:54:13] c6c6cb03fafd4b31493478e76b490650 local.INFO: Hello world

Dec 11 13:55:44 trinsic Fimedi[13390]: [2018-12-11 16:55:44] [c6c6cb03fafd4b31493478e76b490650:xUs2WxIb3TvKcpCpFNPFyvBChE88Nk0YbwZI3KrY] local.INFO: Hello world

取决于我如何计算用户/会话ID。