在注冊(cè)ServerProvider時(shí),Sentry/Laravel/ServiceProvider
先于AliyunLogProvider注冊(cè)磺樱,而Sentry/Laravel/ServiceProvider
的
register方法中(見(jiàn)下圖)調(diào)用了$this->app->make('log')
罢坝,此時(shí)log組件提前被注入為單例模式的框架默認(rèn)logger恋追,導(dǎo)致后續(xù)AliyunLogProvider進(jìn)行注冊(cè)時(shí)供常,調(diào)用$this-app->configureMonologUsing(...)
,設(shè)置自定義日志失效偿枕。
我們先看一下框架中l(wèi)og組件如何實(shí)現(xiàn)依賴(lài)注入璧瞬,主要的幾個(gè)方法:
- make: 獲取綁定對(duì)象
- bind: 簡(jiǎn)單綁定,每次都重新解析
- <font style="color:red;">singleton: 綁定一個(gè)單例渐夸,只會(huì)解析一次嗤锉,后面的調(diào)用都會(huì)從容器中- - 返回相同的實(shí)例</font>
- instance: 綁定實(shí)例,后面的調(diào)用都會(huì)從容器中返回指定的實(shí)例
如下圖代碼所示墓塌,在Laravel\Lumen\Application.php文件里的registerLogBindings方法瘟忱,可以看到Psr\Log\LoggerInterface
名稱(chēng)使用了singleton的單例綁定模式,如果存在$this->monologConfigurator則優(yōu)先使用苫幢,否則使用默認(rèn)的Logger访诱。
大家可能會(huì)疑問(wèn),開(kāi)始講的不是log
嗎态坦,怎么跳出一個(gè)Psr\Log\LoggerInterface
?
在Laravel\Lumen\Application.php框架核心代碼中棒拂,$this->aliases
(見(jiàn)Line:804)有一些框架默認(rèn)的別名映射關(guān)系伞梯,其中'log'-> 'Psr\Log\LoggerInterface'。
解決方案
將SentryServiceProvider的注冊(cè)放于AliyunLogProvider之后帚屉。