如何获得有关例外的电子邮件通知?


14

如何设置针对网站上记录或抛出的异常的电子邮件通知?

更新:一些人对以下事实发表了评论:如果您收到所有异常电子邮件,您可能会收到太多电子邮件。我倾向于让异常日志保持简洁。我认为那里发生的一切都是一个例外。如果它具有预期的功能并且没有问题,那么我想捕获该异常,如果需要,可以将其记录到另一个文件(可能是system.log),而不是将其记录到exception.log。

但是,如果您不想清理的exception.log中有很多杂音,则您可能不想这样做。


6
您将崩溃GMAIL
benmarks 2013年

Answers:


4

您可以使用Magento Hackthon Logger来完成此工作:https : //github.com/firegento/firegento-logger/

这不是问题,但是该扩展有一些扩展:https : //github.com/magento-hackathon/LoggerSentry/

我想说的是:轻松实现自己的“作家” :-)


真好!谢谢保罗。这样可以让您通过电子邮件发送异常日志吗?那是我感兴趣的主要用例,我认为某些东西通常可以适用于许多Magento安装。
kalenjordan

您可以设置各种日志处理方式,将异常发送到XMPP(Gmail聊天),将错误发送到邮件,以及将通知记录到数据库。
Paul Hachmang 2013年

仅供参考,该项目已被移至... github.com/firegento/firegento-logger
cr脚的爪子

@PaulHachmang的第一个链接 github.com/magento-hackathon/Logger死了。可能要更新它。
SR_Magento 2015年

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    
    }
}

注意这一点。如果网站上出现问题,您将收到大量电子邮件。这本身会将服务器本身拖下。然后,您不仅会遇到损坏的站点,而且会遇到无法访问的服务器!然后,您最终还必须从邮件队列中清除大量邮件。这是我过去的经历
ProxiBlue

那是个很好的观点。我们不是在自己管理邮件服务器(Mandrill),但是如果突然由于某些原因突然出现异常,那么事情可能会很快被阻塞。
kalenjordan

我一直以为邮件队列将是一个很好的模块。(任何托管在github上的接收者/知道一个吗?)-基本上任何magento发送的电子邮件都将被丢弃到邮件队列中,而cron会每隔x分钟运行一次,并在队列中发送下一封电子邮件。que可能有一个计数器,如果放置了相同的消息,则可能只是在计数器上。因此,如果您有100条来自同一异常的异常消息,您将仅收到1封电子邮件,并带有“此电子邮件的xxx实例”。检查电子邮件是否从magento发送也很重要。-我只是没有时间写这本书:(
ProxiBlue

7

通过电子邮件发送每个异常可能会导致大量邮件。

将异常记录到异常日志中,然后每天在Linux中使用cronjob一次将其发送给自己,可能是一个更好的选择

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作业传递异常日志的简单性,但是我不确定我是否喜欢每次通过电子邮件发送清除日志的想法。
kalenjordan

+1; 因为我个人认为这是执行此操作的最佳选择。感谢您分享您的想法:-)
Rajeev K Tomy 2014年


1

我不喜欢Mage :: log的自定义writerModel的实现,或者我不理解。对我来说,它没有利用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似乎是最自然的地方。
kalenjordan

请注意XX_XXX_Model_Log是writer_model!只需配置您的config.xml并在增强方法中添加电子邮件编写器即可发送一些邮件。也许我们误会了。
Andreas Dyballa 2013年

抱歉,我的意思是作家模型与作家流模型。无论如何,我上面给出的解决方案都可以正常工作,并且看起来像这样可读,并且SLOC更少。
kalenjordan

使用此解决方案,您可以使用Zend框架进行Zend日志记录,并使用过滤器和优先级配置所需的任意多个编写器。因此,很容易地进一步创建一个可配置的(优先级)文件记录器,您可以每小时通过邮件与Mage cronjob进行发送。
Andreas Dyballa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.