Как я могу получать уведомления по электронной почте для исключений?

14

Как настроить уведомления по электронной почте для исключений, которые либо регистрируются, либо выбрасываются на сайт?

ОБНОВЛЕНИЕ: Несколько человек прокомментировали тот факт, что вы можете ожидать получить слишком много электронных писем, если у вас есть все исключения по электронной почте. Я предпочитаю вести журнал исключений довольно легким. Все, что там происходит, я рассматриваю как исключение. Если это ожидаемая функциональность, а не проблема, то мне нравится перехватывать исключение, возможно, записывать его в другой файл (возможно, system.log), если это необходимо, но не регистрировать его в файле exception.log.

Но если в вашем файле исключений есть много шума, который вы не хотите чистить, вы, вероятно, не захотите этого делать.

kalenjordan
источник
6
ВЫ ПОКАЖИТЕ GMAIL
отметки

Ответы:

4

Вы можете использовать Magento Hackthon Logger для этой работы: https://github.com/firegento/firegento-logger/

Это не вопрос, но есть расширения для расширения: https://github.com/magento-hackathon/LoggerSentry/

Что я хочу сказать: легко реализовать свой собственный «писатель» :-)

Пол Хахманг
источник
Ницца! Спасибо, Пол. Позволит ли это по электронной почте только журналы исключений? Это был основной вариант использования, который меня интересовал, и я думаю, что это может быть применимо ко многим установкам Magento.
Календжордан
Вы можете установить различные настройки, что делать с журналами, отправлять исключения в XMPP (чат Gmail), отправлять ошибки на почту и регистрировать уведомления в базе данных, например.
Пол Хахманг
Просто к вашему сведению, этот проект был перенесен ... github.com/firegento/firegento-logger
Scruffy Paws,
@PaulHachmang первая ссылка github.com/magento-hackathon/Logger мертва. Может захотеть обновить его.
SR_Magento
8

Это не было так легко доступно, как я думал, что это должно быть из некоторых поисков, которые я сделал, поэтому я публикую вопрос / ответ на вопрос для дальнейшего использования.

Брошенные исключения

Вы можете включить уведомления по электронной почте для исключений, которые генерируются с помощью errors / local.xml. Вы можете скопировать свой файл errors/local.xml.templateв «errors / local.xml» и указать адрес электронной почты и строку темы, которые вы хотите использовать.

<config>
    <skin>default</skin>
    <report>
        <action>email</action>
        <subject>domain.com exception</subject>
        <email_address>name@example.com</email_address>
        <trash>leave</trash>
    </report>
</config>

Затем, если какие-либо исключения будут сгенерированы и перехвачены системой обработки ошибок Magento, где конечному пользователю отображается экран отчета об ошибке, вы получите уведомление по электронной почте.

Записанные исключения

Если вы также хотите получать уведомления по электронной почте об исключениях, которые не генерируются, а скорее регистрируются, вам нужно немного продвинуться под капотом.

Сначала переопределите базовый класс записи журнала .

Как только вы это сделаете, просто вставьте код, чтобы отправить себе электронное письмо после того, как исключение будет зарегистрировано. Помните, что вам нужно сохранить имя файла журнала изнутри __construct(), чтобы иметь доступ к нему из _write()метода.

class Module_Core_Model_Zend_Log_Writer_Stream extends Zend_Log_Writer_Stream
{
    protected $_streamOrUrl;

    public function __construct($streamOrUrl, $mode = NULL)
    {
        parent::__construct($streamOrUrl, $mode);

        $this->_streamOrUrl = $streamOrUrl;
    }

    protected function _write($event)
    {
        parent::_write($event);

        if (strpos($this->_streamOrUrl, 'exception.log') === false) {
            return;
        }

        // Send email here    
    }
}
kalenjordan
источник
Будьте осторожны с этим. Если что-то пойдет не так на сайте, вы получите поток писем. Это само по себе приведет к падению самого сервера. В результате вы получаете не просто сломанный сайт, а недоступный сервер! Затем вам в конечном итоге придется также удалить много писем из почтовой очереди. Это случилось со мной в прошлом
ProxiBlue
Неплохо подмечено. Мы сами не управляем почтовым сервером (Mandrill), но все же вещи могут быстро засориться, если внезапные исключения по какой-то причине начнут затопляться.
Календжордан
Я всегда думал, что почтовая очередь будет отличным модулем. (есть кто-нибудь, кто принимает на хостинге на github / знаете ли вы?) - в основном любые электронные письма, которые magento отправляет для отправки в почтовую очередь, с cron, который запускается каждые x минут и отправляет следующее электронное письмо в очереди. У очереди может быть счетчик, и если размещено идентичное сообщение, он может просто увеличить счетчик. Таким образом, если у вас есть 100 сообщений об исключениях, из того же исключения, вы получите только 1 электронное письмо с «xxx экземплярами этого письма». Это также дало бы отличную возможность проверить, были ли отправлены письма от magento. - У меня просто нет времени, чтобы написать это :(
ProxiBlue
7

Отправка каждого исключения по электронной почте, вероятно, приведет к большому количеству писем.

Возможно, было бы лучше просто записать исключения в журнал исключений и отправить их по электронной почте один раз в день, используя cronjob в linux

0 23 * * * /usr/lib/sendmail email@domain.com < /home/shop.com/www/var/log/exception.log

И, возможно, очистка после отправки по почте

0 23 * * * /usr/lib/sendmail email@domain.com < /home/shop.com/www/var/log/exception.log;rm /home/shop.com/www/var/log/exception.log

Или вы можете выполнять его каждый час, если вам нужна более высокая частота.

Таким образом, нет необходимости перезаписывать какие-либо файлы и сохранять нагрузку на сервер, который постоянно отправляет вам письма.

Сандер Мангель
источник
Спасибо Сандер. Однако я бы сказал, что журналирование исключений - это проблема, которую необходимо решить, поэтому у вас должно быть небольшое количество регистрируемых исключений. Мне нравится простота задания cron для передачи журнала исключений, но я не уверен, что мне нравится идея очищать журнал каждый раз, когда он отправляется по электронной почте.
Календжордан
+1; потому что лично я считаю, что это лучший вариант для этого. Спасибо, что поделились своими мыслями :-)
Rajeev K Tomy
2

может быть, вы также можете быть заинтересованы в моей интеграции Magento / Monolog

https://github.com/aleron75/magemonolog

С уважением Алессандро

Алессандро Рончи
источник
Хорошая работа сделана, просто хотите знать, тестируется ли она на magento версии 1.7? Он не отправляет мне письма на магнитной версии 1.7.0.2
Haris
1
Извините @Haris, я не знаю, но неотправленная электронная почта, скорее всего, зависит от конфигурации вашего почтового сервера, а не от расширения
Алессандро Рончи
1

Мне не нравится реализация пользовательского writerModel Mage :: log, или я не понимаю этого. Для меня это не использует дизайн Zend_Log, чтобы включить n авторов. Я бы взял журнал, а не писатель. Поэтому я сделал обходной путь, чтобы использовать все преимущества Zend_Log и по-прежнему писать не так много кода, так как я собираю Zend_log.

class XX_XXX_Model_Log extends Zend_Log_Writer_Abstract{

/**
 * @var Zend_Log
 */
protected $zendLog = array();

/**
 *
 * @param  mixed $writer Zend_Log_Writer_Abstract or Config array
 * @return void
 */
public function addWriter($writer)
{
    return $this->zendLog->addWriter($writer);
}

/**
 * Write a message to the log.
 *
 * @param  array  $event  log data event
 * @return void
 */
protected function _write($event){
    $this->zendLog->log($event['message'], $event['priority']);
}

/**
 * Konstruktor erweitert Log automatisch um Writer
 *
 * @param sting $file
 */
public function __construct($file){
    $this->zendLog = new Zend_Log();
    $this->enhance($file);
}

/**
 * Hier werden die Writer and Zend_Log angehangen
 *
 * @param sting $file
 */
public function enhance($file){
    /* put your custom Logger here - example firePHP*/
        $writer = Mage::getModel('gdcore/firephp');
        $writer->addFilter(Zend_Log::Debug);
        $this->addWriter($writer);
    }
}

/**
 * Construct a Zend_Log driver
 * 
 * @param  array|Zen_Config $config
 * @return Zend_Log_FactoryInterface
 */
static public function factory($config){
    return Zend_Log::factory($config);
}
}

Кстати, в Magento 1.7 я получаю всего несколько писем. Я полагаю, что в каждом письме есть исключения / ошибки для одного запроса. Так что часто посещаемый сайт все равно будет содержать много писем. Я посмотрю на это. К настоящему времени это нормально для меня.

Андреас Дибалла
источник
Спасибо Андреас. Я не на 100% понимаю роль модели писателя по сравнению с моделью лога, но это казалось наиболее естественным местом для расширения Magento в этом случае.
Календжордан
Обратите внимание, что XX_XXX_Model_Log является writer_model! Просто настройте свой config.xml и добавьте средство записи электронной почты в методе Enhify, чтобы отправлять и некоторые письма. Возможно, мы неправильно поняли.
Андреас Дибалла
Извините, я имел в виду модель писателя против модели потока писателя. Во всяком случае, решение, которое я дал выше, работает нормально, и выглядит так же читабельно, как и это, а также имеет меньше SLOC.
Календжордан
С этим решением вы можете использовать Zend Framework для Zend-журналов и настроить столько писателей, сколько вам нужно, с фильтрами и приоритетом. Так что очень легко сделать настраиваемый (приоритетный) файл писателя, который вы можете отправлять с помощью cronjob Mage каждый час по почте.
Андреас Дибалла
0

Вы также можете использовать модуль для создания уведомлений по электронной почте или получать ежедневные отчеты о клиентах, которые получили исключения:

Вот объяснение реализации: https://grafzahl-io.blogspot.de/2017/03/notifications-for-every-exception-in-magento.html

Это модуль для отслеживания ошибок и других событий (даже применить скидку к клиенту, если он получил исключение): https://grafzahl.io/notify-module

grafzahl-ю
источник