使用BearyChat实时推送Laravel网站Bug

  • 更新时间:2年零31天前
  • 浏览量:2426
  • 发布人:思过崖

Laravel 集成 Monolog 来做日志处理,Monolog非常强大,也容易扩展,其实它本身已经支持很多Handler了,你可以把日志发送到邮件或者其他日志收集服务器或者系统中,因为我们团队使用Bearychat 作为团队沟通工具,所以把Laravel项目的实时错误日志推送到Bearychat的一个讨论组中,方便组员迅速发现异常和解决问题 ,其实很简单没多少行代码就搞定了。

创建BearyChatHandler

  1. <?php
  2. namespace App;
  3. use Monolog\Handler\AbstractProcessingHandler;
  4. use Monolog\Logger;
  5. use Monolog\Handler\Curl;
  6. class BearyChatHandler extends AbstractProcessingHandler
  7. {
  8. private $data;
  9. private $webhook;
  10. public function __construct($webhook, $channel, $level = Logger::NOTICE, $bubble = true)
  11. {
  12. $this->data['channel'] = $channel;
  13. $this->webhook = $webhook;
  14. parent::__construct($level, $bubble);
  15. }
  16. /**
  17. * {@inheritDoc}
  18. */
  19. protected function write(array $record)
  20. {
  21. $postData = [
  22. 'text' => $record['datetime']->format('Y-m-d H:i:s') . '-' . $record["level"] . '-' . $record["level_name"],
  23. 'markdown' => false,
  24. 'notification' => 'Laravel Error Log',
  25. 'attachments' => [
  26. [
  27. 'title' => current(preg_split("/([.\n\r]+)/i", $record['message'])),
  28. 'text' => $record['message'],
  29. 'color' => '#ffa500'
  30. ]
  31. ]
  32. ];
  33. $postString = json_encode(array_merge($this->data, $postData));
  34. $ch = curl_init();
  35. curl_setopt($ch, CURLOPT_URL, $this->webhook);
  36. curl_setopt($ch, CURLOPT_POST, true);
  37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  38. curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
  39. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  40. "Content-Type: application/json"
  41. ));
  42. Curl\Util::execute($ch);
  43. }
  44. }

只要继承AbstractProcessingHandler,重写write方法就可以了,write中向Bearychat的webhook地址POST数据就可以了,$recordMonolog记录日志的详情

  • 创建一个BearyChat组用来接受通知

    • 新建讨论组,比如叫”Laravel错误日志报告”
    • 添加机器人到讨论组,点击Incoming添加一个比如叫”Laravel日志机器人”,发送目标选择上一步建的”Laravel错误日志报告”,这样就获取了webhook的URL地址了
    • 把相应的人员加到这个讨论组
  • 集成ChearyChatHandler

官方手册上讲到,你像这样完全控制Monolog:

Custom Monolog Configuration#
If you would like to have complete control over how Monolog is configured for your application, you may use the application’s configureMonologUsing method. You should place a call to this method in your bootstrap/app.php file right before the $app variable is returned by the file:
$app->configureMonologUsing(function($monolog) { $monolog->pushHandler(…); });
return $app;

但是我们除了发送到ChearyChat以外还要保留默认的记录到log文件的方式,所以我们不这样做,我们只要在 Exception Handler的地方添加一个我们的ChearyChatHandler就可以了。

修改app/Exceptions/Handler.php,在report方法中添加如下代码就可以了:

  1. <?php
  2. namespace App\Exceptions;
  3. use App\BearyChatHandler;
  4. ......
  5. use Log;
  6. class Handler extends ExceptionHandler
  7. {
  8. ......
  9. public function report(Exception $e)
  10. {
  11. $monolog = Log::getMonolog();
  12. $monolog->pushHandler(new BearyChatHandler('https://yourhookurl','Laravel日志机器人'));
  13. return parent::report($e);
  14. }
  15. ......
  16. }

好了,在代码中故意写个错误,就可以看到BearyChat收到错误日志了。

BearyChat.png