【问题标题】:Custom monolog in order to perform extra actions自定义独白以执行额外操作
【发布时间】:2015-02-27 14:34:59
【问题描述】:

大家好,

在我的项目中,有时我需要发送电子邮件和记录消息。问题是我没有使用 swift mailer,我使用的是一个为我发送电子邮件的 API。

我尝试过的解决方案是创建了一个自定义处理器,并在其中注入了我的客户端邮件程序。我关注了http://symfony.com/doc/current/cookbook/logging/monolog.html#adding-a-session-request-token

所以我有如下内容:

namespace Tools\LoggerBundle;

use Symfony\Component\HttpFoundation\Session\Session;

class CustomProcessor
{
    private $session;
    private $token;
    // Client Mailer
    private $mailer;

    public function __construct(Session $session, $mailer)
    {
        $this->session = $session;
        $this->mailer = $mailer;
    }

    public function processRecord(array $record)
    {
        if (null === $this->token) {
            try {
                $this->token = substr($this->session->getId(), 0, 8);
            } catch (\RuntimeException $e) {
                $this->token = '????????';
            }
            $this->token .= '-' . substr(uniqid(), -8);
        }
        $record['extra']['token'] = $this->token;

        // Sends an email    
        $this->mailer->send('Alert', print_r($record, true));

        return $record;
    }
}

这很好用,除了我只需要在级别大于警告时发送电子邮件。同时,正常的日志记录不应该停止。

你有什么建议?

【问题讨论】:

标签: php symfony logging monolog


【解决方案1】:

您应该使用 Handler 类来发送电子邮件,而不是在处理器上进行

<?php

use Monolog\Handler\AbstractProcessingHandler;

class EmailHandler extends AbstractProcessingHandler
{
    private $mailer;

    public function __construct($mailer, $level = Logger::WARNING, $bubble = true)
    {
        parent::__construct($level, $bubble);
        $this->mailer = $mailer;
    }

    protected function write(array $record)
    {
        $this->mailer->send($record['level_name'], print_r($record, true));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多