【问题标题】:Laravel to send email for logging instead of writing to storageLaravel 发送电子邮件进行日志记录而不是写入存储
【发布时间】:2013-10-27 19:09:53
【问题描述】:

我查看了文档,但找不到更改任何错误日志记录的方法,这些错误通常写入 /app/storage/logs/logs/log-apache2handler-xxxx-xx-xx.txt

但在生产服务器上,我希望将其中的任何一个通过电子邮件发送给我。

有没有办法做到这一点?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    Due Laravel 在内部使用 Monolog 库,我认为使用预期的日志处理程序是一个更好的解决方案。因此,每个未捕获的异常和手动调用 Log 都会发送到您的邮件地址。

    如果您使用的是 mail()

    将 NativeMailerHandler 添加到您的 app/start/global.php:

    $logFile = 'log-'.php_sapi_name().'.txt';
    
    Log::useDailyFiles(storage_path().'/logs/'.$logFile);
    Log::getMonolog()->pushHandler(
        new Monolog\Handler\NativeMailerHandler(
            'to@domain.de',
            '[Log] Some Subject',
            'from@domain.de'
            Logger::ERROR, // set minimal log lvl for mail
            true, // bubble to next handler?
            70 // max column width in your mail
        )
    );
    

    如果你已经配置了 Laravel SMTP 邮件

    将 SwiftMailerHandler 添加到您的 app/start/global.php:

    (Swift Mailer 也被 Laravel 内部使用)

    $logFile = 'log-'.php_sapi_name().'.txt';
    
    Log::useDailyFiles(storage_path().'/logs/'.$logFile);
    Log::getMonolog()->pushHandler(
        new Monolog\Handler\SwiftMailerHandler(
            Mail::getSwiftMailer(),
            Swift_Message::newInstance('[Log] Some Subject')->setFrom('from@domain.de')->setTo('to@domain.de'),
            Logger::ERROR, // set minimal log lvl for mail
            true // bubble to next handler?
        )
    );
    

    如果您愿意,请按照另一篇文章中的说明添加环境检查。对于许多其他处理程序,还可以查看https://github.com/seldaek/monolog

    【讨论】:

      【解决方案2】:

      使用类似的包

      首先通过 Composer 安装这个包。编辑项目的 composer.json 文件以要求 dinesh/bugonemail。

      或访问

      http://dineshrabara.github.io/bugonemail/

      【讨论】:

        【解决方案3】:

        我仍然记录错误,如果是生产,请发送电子邮件,但有异常:

        App::error(function(Exception $exception, $code)
        {
        Log::error($exception);
        
        if (Config::getEnvironment() == 'production')
        {
            $data = array('exception' => $exception);
            Mail::send('emails.error', $data, function($message)
            {
                $message->from($email_app);
                $message->to(Config::get('settings.error_email'))->subject(Config::get('settings.app_name') . ' Error');
            });
            Log::info('Error Email sent to ' . Config::get('settings.error_email'));
            return Response::view('errors.500', array(), 500);
        }
        });
        

        【讨论】:

        • 用 App::environment() 代替 Config::getEnvironment() 怎么样?
        • 为什么当我这样做时它会给我发送一个随机数的相同邮件?
        • 为了让它看起来和日志中的一样,最好将异常强制转换为字符串。 $data = array('exception' => (string)$exception);
        【解决方案4】:
        App::error(function(Exception $exception)
        {
            //Log::error($exception);
            // send email
        });
        

        在此处查看文档:http://laravel.com/docs/errors#handling-errors

        基本上,在处理程序中放入什么逻辑取决于您。我认为也可以创建一个单独的 global.php 用于生产,而无需放置 if-else 语句来找出您所在的环境。

        【讨论】:

        • 如果你想要一封电子邮件,走这条路肯定更好。如果经常弹出相同的错误,请注意不要破坏您的收件箱。您不希望突然收到 893475934 封未读电子邮件。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 2016-11-12
        • 2016-05-02
        • 1970-01-01
        • 2020-05-22
        相关资源
        最近更新 更多