Магазин Монолог в базе данных - PullRequest
0 голосов
/ 07 марта 2019

Я создаю приложение с Symfony 4.2, я хочу сохранить все журналы в базе данных, я использую MonologBundle.

Monolog.yml

monolog:
    handlers:
        main:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
            channels: ["!event"]
        console:
            type: console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine", "!console"]

Я хочу хранить данные в базе данных, как это enter image description here

Как я могу сделать это с Symfony.

1 Ответ

0 голосов
/ 07 марта 2019

Этого можно добиться, создав собственный монологичный канал (например, doctrine_channel) и обработчик (например, doctrine), чтобы идти с ним.Обновите приведенный ниже пример в соответствии с вашими потребностями.

Конфигурация Monolog

monolog:
    channels: [doctrine_channel]
    handlers:
        main:
            ...
            channels: [... !doctrine_channel]
        console:
            ...
            channels: [... !doctrine_channel]
        doctrine:
            type: service
            channels: [doctrine_channel]
            id: app.logger.doctrine_handler

Конфигурация службы

services:
    app.logger.doctrine_handler:
        class: App\Logger\DoctrineHandler
        arguments:
            - "@doctrine.orm.entity_manager"

DoctrineHandler

namespace App\Logger;

use App\Entity\Log;
use Doctrine\ORM\EntityManagerInterface;
use Monolog\Handler\AbstractProcessingHandler;

class DoctrineHandler extends AbstractProcessingHandler
{
    private $initialized;
    private $entityManager;
    private $channel = 'doctrine_channel';

    public function __construct(EntityManagerInterface $entityManager)
    {
        parent::__construct();

        $this->entityManager = $entityManager;
    }

    protected function write(array $record)
    {
        if (!$this->initialized) {
            $this->initialize();
        }

        if ($this->channel != $record['channel']) {
            return;
        }

        $log = new Log();
        $log->setMessage($record['message']);
        $log->setLevel($record['level_name']);

        $this->entityManager->persist($log);
        $this->entityManager->flush();
    }

    private function initialize()
    {
        $this->initialized = true;
    }
}

Результат

mysql> SELECT * FROM log;
+----+----------+-----------+---------------------+
| id | message  | level     | created_at          |
+----+----------+-----------+---------------------+
|  1 | Welcome! | INFO      | 2019-02-07 19:00:00 |
|  2 | Go back! | WARNING   | 2019-02-07 19:00:05 |
|  3 | Help!    | EMERGENCY | 2019-02-07 19:00:10 |
+----+----------+-----------+---------------------+
3 rows in set (0.00 sec)

Затем введите @monolog.logger.doctrine_channel (введите подсказку LoggerInterface) к вашим услугам или куда вы хотитевойти что-то.Это должно работать!Теперь вы можете рефакторинг / улучшение по вашему желанию.

...