Как добавить идентификатор пользователя аутентификации или сеанс для входа в Laravel 5.7?

Моя цель

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

В рамках своего исследования я обнаружил, что есть хорошие пакеты и учебные пособия для регистрации активности пользователя в базе данных. Но, по крайней мере, на данный момент я намерен двигаться вперед без дополнительных пакетов и регистрации в системный журнал, как я сейчас делаю.

Типичный вызов журнала в моем приложении будет выглядеть так:

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

Еще я мог бы сделать что-нибудь вроде:

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

Это было бы похоже на то, что предлагает пример документации:

Как добавить идентификатор пользователя аутентификации или сеанс для входа в Laravel 5.7?

В настоящее время я делаю это для определенных строк, но поскольку я хотел бы, чтобы это было во всех вызовах журнала, это стало бы похоже на повторение себя каждый раз, когда я что-то регистрирую.

Желаемый результат

Текущий:

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 []

Мой подход

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

Но моя текущая проблема заключается в том, что в момент исключения класса CustomizeFormatter идентификатор Auth, похоже, еще не решен (не уверен в этом, но 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',
    ],

Мои вопросы)

  • Есть ли способ разрешить авторизацию пользователя на этом этапе или какой-либо другой подход для этого?
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
3
0
1 785
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Спасибо за подсказку, @DigitalDrifter. Имеет большой смысл заставить Laravel разрешить объект запроса и получить оттуда доступ к пользователю auth, и мы, кажется, приближаемся к проблеме. Однако, несмотря на то, что объект запроса доступен, пользователь ($this->request->user()) возвращает значение null. (Я проверяю, что я вошел в систему, поэтому я не бегаю с консоли или чего-то подобного).

alariva 11.12.2018 04:53
Здесьdd($this->request) прямо в __invoke($logger). Я подозреваю, что это потому, что \Illuminate\Session\Middleware\AuthenticateSession::class, запускается много раз после настройки журналирования? Но на самом деле не уверен в этом.
alariva 11.12.2018 05:00

Если вы используете dd($this->request->user()); сразу после присваивания в конструкторе, что будет на выходе?

Brian Lee 11.12.2018 05:09

Сразу после присваивания в конструкторе или сразу после получения __invoke в обоих случаях он возвращает null.

alariva 11.12.2018 13:11

Другой возможный вариант - расширить или обернуть Illuminate \ Log \ Logger и разрешить и добавить идентификатор пользователя аутентификации в этой точке.

alariva 11.12.2018 13:15
Ответ принят как подходящий

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

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

<?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

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

Другие вопросы по теме