Логгер для всех запросов на сайте

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
@edifanoff
Сообщения: 3
Зарегистрирован: 2019.03.30, 15:30

Логгер для всех запросов на сайте

Сообщение @edifanoff »

Как можно реализовать логгер всех запросов на сайте.
Все request, responce, body, queryParams
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Логгер для всех запросов на сайте

Сообщение ElisDN »

Поведением, навешанным на before/afterRequest.
Аватара пользователя
@edifanoff
Сообщения: 3
Зарегистрирован: 2019.03.30, 15:30

Re: Логгер для всех запросов на сайте

Сообщение @edifanoff »

Что-то типо такого?

Код: Выделить всё

class MrLogger
{
    const CATEGORY_REQUEST_NAME = 'REQUEST';
    const CATEGORY_RESPONSE_NAME = 'RESPONSE';

    public $request;
    public $response;

    public function __construct()
    {
        $this->request = Yii::$app->getRequest();
        $this->response = Yii::$app->getResponse();
    }


    public function logRequest()
    {
        $method = strtoupper($this->request->getMethod());
        $uri = $this->request->getPathInfo();
        $bodyAsJson = json_encode($this->request->rawBody);
        $message = "{$method} {$uri} - {$bodyAsJson}";
        Yii::info($message, self::CATEGORY_REQUEST_NAME);
    }


    public function logResponse()
    {
        $method = strtoupper($this->request->getMethod());
        $uri = $this->request->getPathInfo();
        $bodyAsJson = json_encode($this->response->data);
        $message = "{$method} {$uri} - {$bodyAsJson}";
        Yii::info($message, self::CATEGORY_RESPONSE_NAME);
    }
}

Код: Выделить всё

        'MrLogger' => [
            'class' => \common\components\MrLogger::class,
        ],
    ],
    'on afterRequest' => function () {
        Yii::$app->get('MrLogger')->logRequest();
        Yii::$app->get('MrLogger')->logResponse();
    },
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Логгер для всех запросов на сайте

Сообщение ElisDN »

Код: Выделить всё

class LogBehavior extends Behavior
{
    public function events(): array
    {
        return [
            Application::EVENT_BEFORE_REQUEST => 'beforeRequest',
            Application::EVENT_AFTER_REQUEST => 'afterRequest',
        ];
    }

    public function beforeRequest(): void
    {
        $method = strtoupper(Yii::$app->request->getMethod());
        ...
        Yii::info($message, 'REQUEST');
    }

    public function afterRequest(): void
    {
        $method = strtoupper(Yii::$app->request->getMethod());
        ...
        Yii::info($message, 'RESPONSE');
    }
}

Код: Выделить всё

'as log' => LogBehavior::class,
Аватара пользователя
@edifanoff
Сообщения: 3
Зарегистрирован: 2019.03.30, 15:30

Re: Логгер для всех запросов на сайте

Сообщение @edifanoff »

ElisDN писал(а): 2019.04.02, 11:55

Код: Выделить всё

class LogBehavior extends Behavior
{
    public function events(): array
    {
        return [
            Application::EVENT_BEFORE_REQUEST => 'beforeRequest',
            Application::EVENT_AFTER_REQUEST => 'afterRequest',
        ];
    }

    public function beforeRequest(): void
    {
        $method = strtoupper(Yii::$app->request->getMethod());
        ...
        Yii::info($message, 'REQUEST');
    }

    public function afterRequest(): void
    {
        $method = strtoupper(Yii::$app->request->getMethod());
        ...
        Yii::info($message, 'RESPONSE');
    }
}

Код: Выделить всё

'as log' => LogBehavior::class,
Дмитрий, респект тебе!
Спасибо
Ответить