Comment recevoir des notifications par e-mail pour les exceptions?

14

Comment configurer des notifications par e-mail pour les exceptions qui sont soit enregistrées, soit levées sur le site?

MISE À JOUR: Quelques personnes ont commenté le fait que vous pourriez vous attendre à recevoir beaucoup trop de courriels si vous avez reçu chaque exception par courriel. J'ai tendance à garder mon journal d'exceptions assez léger. Tout ce qui se passe là-dedans, je le considère comme une exception. S'il s'agit d'une fonctionnalité attendue et non d'un problème, j'aime intercepter l'exception, éventuellement la consigner dans un autre fichier (peut-être system.log) si nécessaire, mais pas la consigner dans exception.log.

Mais si vous avez beaucoup de bruit dans votre exception.log que vous ne voulez pas nettoyer, vous ne voudrez probablement pas le faire.

kalenjordan
la source
6
VOUS
CRASSEZ

Réponses:

4

Vous pouvez utiliser le Magento Hackthon Logger pour ce travail: https://github.com/firegento/firegento-logger/

Ce n'est pas la question, mais il existe des extensions pour l'extension: https://github.com/magento-hackathon/LoggerSentry/

Ce que je veux dire: il est facile d'implémenter votre propre "Writer" :-)

Paul Hachmang
la source
Agréable! Merci Paul. Cela vous permettrait-il de ne vous envoyer par e-mail que des journaux d'exceptions? C'était le cas d'utilisation principal qui m'intéressait et je pense que quelque chose pourrait être généralement applicable à de nombreuses installations de Magento.
kalenjordan
Vous pouvez configurer divers avis sur l'utilisation des journaux, envoyer des exceptions à XMPP (chat gmail), envoyer des erreurs par courrier et enregistrer les avis dans la base de données par exemple.
Paul Hachmang
Juste pour info, ce projet a été déplacé ... github.com/firegento/firegento-logger
Scruffy Paws
@PaulHachmang le premier lien github.com/magento-hackathon/Logger est mort. Peut vouloir le mettre à jour.
SR_Magento
8

Cela ne semblait pas aussi facilement accessible que je pensais que cela devrait être dû à une recherche que j'ai faite, donc je poste une question / réponse pour une référence future.

Exceptions levées

Vous pouvez activer les notifications par e-mail pour les exceptions levées à l'aide d'erreurs / local.xml. Vous pouvez copier votre errors/local.xml.templatefichier dans «erreurs / local.xml» et déposer l'adresse e-mail et la ligne d'objet que vous souhaitez utiliser.

<config>
    <skin>default</skin>
    <report>
        <action>email</action>
        <subject>domain.com exception</subject>
        <email_address>[email protected]</email_address>
        <trash>leave</trash>
    </report>
</config>

Ensuite, si des exceptions sont levées et détectées par le système de gestion des erreurs de Magento, où un écran de rapport d'erreurs s'affiche pour l'utilisateur final, vous recevrez une notification par e-mail.

Exceptions enregistrées

Si vous souhaitez également recevoir des notifications par e-mail pour les exceptions qui ne sont pas levées mais qui sont plutôt enregistrées, vous devrez aller un peu plus loin sous le capot.

Tout d'abord, remplacez la classe principale d'écrivain de journaux .

Une fois que vous avez fait cela, déposez simplement le code pour vous tirer un e-mail après la journalisation de l'exception. N'oubliez pas que vous devez enregistrer le nom du fichier journal dans le __construct()afin d'y accéder à partir de la _write()méthode.

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
la source
Soyez prudent. Si quelque chose se passe mal sur le site, vous vous retrouverez avec un flot d'emails. Cela en soi entraînerait le serveur lui-même vers le bas. Vous vous retrouvez alors avec non seulement un site cassé, mais un serveur inaccessible! Vous finissez alors par devoir également effacer un grand nombre de mails du mail que. Cela m'est arrivé dans le passé
ProxiBlue
C'est un bon point. Nous ne gérons pas le serveur de messagerie nous-mêmes (Mandrill), mais les choses pourraient toujours se boucher rapidement si toutes les exceptions soudaines commençaient à se répandre pour une raison quelconque.
kalenjordan
J'ai toujours pensé qu'un mail que serait un excellent module. ? Le que pourrait avoir un compteur et si un message identique est placé, il pourrait simplement remonter le compteur. Ainsi, si vous avez 100 messages d'exception, de la même exception, vous n'obtiendrez qu'un seul e-mail, avec une «xxx instances de cet e-mail». Il serait également utile de vérifier si des e-mails ont été envoyés depuis magento. - Je n'ai tout simplement pas le temps d'écrire celui-ci :(
ProxiBlue
7

L'envoi de chaque exception par e-mail entraînera probablement BEAUCOUP de courrier.

Il serait peut-être préférable de simplement enregistrer les exceptions dans le journal d'exceptions et de les envoyer une fois par jour à vous-même à l'aide d'un cronjob sous linux.

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

Et éventuellement le nettoyer après l'avoir envoyé par la poste

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

Ou vous pouvez l'exécuter toutes les heures si vous avez besoin d'une fréquence plus élevée.

De cette façon, il n'est pas nécessaire d'écraser les fichiers et de maintenir la charge sur le serveur qui vous envoie constamment des e-mails.

Sander Mangel
la source
Merci Sander. Je dirais cependant que les exceptions qui se connectent sont un problème qui doit être résolu, vous devriez donc avoir une faible occurrence d'exceptions enregistrées. J'aime la simplicité d'un travail cron pour diriger le journal des exceptions, mais je ne suis pas sûr que j'aime l'idée d'effacer le journal chaque fois qu'il est envoyé par e-mail.
kalenjordan
+1; parce que je pense personnellement que c'est la meilleure option pour ce faire. Merci d'avoir partagé vos réflexions :-)
Rajeev K Tomy
2

peut-être que vous pouvez également être intéressé par mon intégration Magento / Monolog

https://github.com/aleron75/magemonolog

Cordialement Alessandro

Alessandro Ronchi
la source
Beau travail, je veux juste savoir s'il est testé sur la version 1.7 de magento? Il n'envoie pas d'e-mail pour moi sur la version magnéto 1.7.0.2
Haris
1
Désolé @Haris, je ne sais pas, mais les e-mails non envoyés dépendent probablement de la configuration de votre serveur de messagerie plutôt que de l'extension
Alessandro Ronchi
1

Je n'aime pas l'implémentation de writerModel personnalisé de Mage :: log ou je ne le comprends pas. Pour moi, il ne profite pas de la conception de Zend_Log pour activer n écrivains. J'aurais pris un journal et non un écrivain. Par conséquent, j'ai fait une solution de contournement pour tirer pleinement parti du Zend_Log et écrire encore peu de code, car j'agrège un 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);
}
}

Au fait, dans Magento 1.7, je ne reçois que quelques e-mails. Chaque e-mail comporte des exceptions / erreurs pour une demande, je suppose. Un site très fréquenté entraînera donc toujours de nombreux e-mails. Je vais devoir regarder ça. Maintenant, ça me va.

Andreas Dyballa
la source
Merci Andreas. Je ne comprends pas à 100% le rôle du modèle d'écrivain par rapport au modèle de journal moi-même, mais cela semblait l'endroit le plus naturel pour étendre Magento dans ce cas.
kalenjordan
Veuillez noter que XX_XXX_Model_Log est un écrivain_modèle! Il vous suffit de configurer votre config.xml et d'ajouter un rédacteur d'e-mails dans la méthode d'amélioration pour envoyer également des e-mails. Peut-être que nous avons mal compris.
Andreas Dyballa
Désolé, je voulais dire le modèle d'écrivain contre le modèle de flux d'écrivain. En tout cas, la solution que j'ai donnée ci-dessus fonctionne bien, et semble aussi lisible que cela et a également moins de SLOC.
kalenjordan
Avec cette solution, vous pouvez utiliser le Zend Framework pour la journalisation Zend et configurer autant d'écrivains que vous voulez avec des filtres et une priorité. Il est donc très facile de créer un écrivain de journalisation de fichiers configurable (prioritaire) supplémentaire que vous pouvez envoyer avec un cronjob Mage toutes les heures par courrier.
Andreas Dyballa
0

Vous pouvez également utiliser un module pour créer des notifications par e-mail ou obtenir des rapports quotidiens de clients qui ont obtenu des exceptions:

Voici la mise en œuvre expliquée: https://grafzahl-io.blogspot.de/2017/03/notifications-for-every-exception-in-magento.html

Ceci est le module pour surveiller les erreurs et autres événements (même appliquer une remise au client s'il a une exception): https://grafzahl.io/notify-module

grafzahl-io
la source