Database 在数据库中存储独白

Database 在数据库中存储独白,database,symfony,monolog,Database,Symfony,Monolog,我一直在用symfony4.2创建一个应用程序,我想在数据库中保存所有日志,我正在使用monogbundle 独白 monolog: handlers: main: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: debug channels: ["!event"] c

我一直在用symfony4.2创建一个应用程序,我想在数据库中保存所有日志,我正在使用monogbundle

独白

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"]
我想像这样在数据库中存储数据


如何使用Symfony实现这一点。

您可以通过创建自定义独白频道(例如
条令频道
)和处理程序(例如
条令
)来实现这一点。根据您的需要更新下面的示例

独白配置

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"
服务配置

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\u通道
(输入提示的
LoggerInterface
)注入到您的服务或任何您想要记录内容的地方。这应该管用!现在,您可以根据自己的意愿进行重构/增强。

它可以工作,但与我想要的不同,使用此代码,对于一个用户的一个操作,数据库中保存的行数始终超过5行。我想要一个操作,一行将自动保存在数据库中。>>
这应该可以!现在,您可以随心所欲地进行重构/增强。
@naruzumaki-您要求“在数据库中存储日志”,而这个答案正是您想要的。其余部分是您的责任,因此请确保继续并进行特定于功能的修改,以实现您所需的任何其他功能<代码>对于一个用户的一个操作,数据库中保存的行始终超过5行。对于一个操作,一行将自动保存在数据库中。-这与您的问题和答案无关。这只是您自己的特定功能的代码/实现中的一种“异味”。我希望我们现在在同一页!