Как добавить идентификатор авторизации пользователя или сеанс для входа в Laravel 5.7? - PullRequest
0 голосов
/ 11 декабря 2018

Моя цель

Я хочу добавить текущий идентификатор пользователя в строки журнала (я использую драйвер syslog) в качестве пользовательского форматирования журнала.

Как часть моего исследованияЯ видел хорошие пакеты и учебные пособия для регистрации активности пользователей в базе данных.Но, по крайней мере, на данный момент я намерен двигаться вперед без дополнительных пакетов и войти в систему 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 []

Мой подход

Я попытался нажать регистратор с успехом наизменив формат, , как предложено в docs .

Но моя текущая проблема заключается в том, что в момент, когда класс CustomizeFormatter исключен, идентификатор Auth, похоже, пока не решен (неуверен в этом, но dd() возвращает ноль, так что это мое предположение):

<?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',
    ],

Мой вопрос (ы)

  • Есть ли способ разрешить аутентификацию пользователя на этом этапе или любой другой подход для достиженияэто?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

На основании ответа DigitalDrifter и части этого сообщения от Эмира Каршиякалы Мне удалось найти достаточно справедливое решение.

Я не смог захватить пользователя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

В зависимости от того, как я вычисляю идентификаторы пользователя / сессии.

0 голосов
/ 11 декабря 2018

Попробуйте передать объект запроса в качестве аргумента конструктора в свой пользовательский класс форматирования, а затем получить доступ к пользователю оттуда:

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