Database 在数据库中存储独白
我一直在用symfony4.2创建一个应用程序,我想在数据库中保存所有日志,我正在使用monogbundle 独白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
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行。对于一个操作,一行将自动保存在数据库中。-这与您的问题和答案无关。这只是您自己的特定功能的代码/实现中的一种“异味”。我希望我们现在在同一页!