在CodeIgniter中集成monolog+Sentry

背景

在CodeIgniter+monolog的项目中集成Sentry。

环境

Mac + php7.1 + nginx
CI 3.1.4 + monolog 1.22(封装类 )+ sentry1.9(这是php包)
Sentry9.0.0
Sentry的安装参考Docker安装私有Sentry服务

流程

首先,按照官方的readme安装sentry是没有问题,但是在登入web系统之后,需要填写Root Url,官方的解释给的很模糊,这里就需要注意,这个url应该填写sentry的url,因为在本文的情况下,php的monolog会通过sentry的包向这个url发送sentry日志请求。如果填错,自然是GG;

其次,向monolog中集成Sentry。首先,在monolog的配置文件的handlers中加入sentry:
$config['handlers'] = array('file', 'sentry');

接着,扩展Log_lib(即codeigniter-monolog的主类),添加处理分支:

case 'sentry':
    $client = new Raven_Client('http://02d64535f55d4575b5274cca18b7108d:ce234d7cbdfe4c15968875435338eea2@localhost:9000/4');
    $handler = new Monolog\Handler\RavenHandler($client);
    $handler->setFormatter(new Monolog\Formatter\LineFormatter("%message% %context% %extra%\n"));
    break;

(这里稍微解释下,@localhost:9000前面的是认证信息,后面的4是sentry中的活动id)

这样,就配置完成了。但是发现访问PHP服务,打出monolog日志之后,并没有传到sentry中。于是漫长的排查就开始了:

  • 首先断点发现,curl返回的错误码是52,即空返回;
    这里写图片描述
  • 于是各种调试,最后在sentry容器中使用tcpdump抓包确认了,是请求根本没有发到sentry服务……真是日乐购;
    这里写图片描述
  • 熟悉fpm的人都知道,默认的fpm端口就是9000,但是比较恶心的是,sentry通过docker启动,监听的是*:9000,而fpm监听的是localhost:9000,竟然不冲突,当然最终的结果就是发给sentry的请求发给了fpm导致emptyreturn;
  • 最后,修改了fpm的端口,修改了nginx的配置,重启了nginx,终于正常了。

最后附上一张sentry数据展示的图片:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/hfut_wowo/article/details/81100892