問題排查
在註冊ServerProvider時,Sentry/Laravel/ServiceProvider先於AliyunLogProvider註冊,而Sentry/Laravel/ServiceProvider的register方法中(見下圖)調用了$this->app->make('log'),此時log組件提前被注入為單例模式的框架默認logger,導致後續AliyunLogProvider進行註冊時,調用$this-app->configureMonologUsing(...),設置自定義日誌失效。
我們先了解框架中log組件如何實現依賴注入,主要的幾個方法:
- make: 獲取綁定對象
- bind: 簡單綁定,每次都重新解析
- singleton: 綁定一個單例,只會解析一次,後面的調用都會從容器中- - 返回相同的實例
- instance: 綁定實例,後面的調用都會從容器中返回指定的實例
如下圖代碼所示,在Laravel\\Lumen\\Application.php文件裡的registerLogBindings方法,可以看到Psr\\Log\\LoggerInterface名稱使用了singleton的單例綁定模式,如果存在$this->monologConfigurator則優先使用,否則使用默認的Logger。
大家可能會疑問,開始講的不是log嗎,怎麼跳出一個Psr\\Log\\LoggerInterface?
在Laravel\\Lumen\\Application.php框架核心代碼中,$this->aliases(見Line:804)有一些框架默認的別名映射關係,其中'log'-> 'Psr\\Log\\LoggerInterface'。
解決方案
將SentryServiceProvider的註冊放於AliyunLogProvider之後。
閱讀更多 互聯網技術分享 的文章