Sentry接入導致阿里雲日誌失效問題排查

問題排查

在註冊ServerProvider時,Sentry/Laravel/ServiceProvider先於AliyunLogProvider註冊,而Sentry/Laravel/ServiceProvider的register方法中(見下圖)調用了$this->app->make('log'),此時log組件提前被注入為單例模式的框架默認logger,導致後續AliyunLogProvider進行註冊時,調用$this-app->configureMonologUsing(...),設置自定義日誌失效。

Sentry接入導致阿里雲日誌失效問題排查

我們先了解框架中log組件如何實現依賴注入,主要的幾個方法:

- make: 獲取綁定對象

- bind: 簡單綁定,每次都重新解析

- singleton: 綁定一個單例,只會解析一次,後面的調用都會從容器中- - 返回相同的實例

- instance: 綁定實例,後面的調用都會從容器中返回指定的實例

如下圖代碼所示,在Laravel\\Lumen\\Application.php文件裡的registerLogBindings方法,可以看到Psr\\Log\\LoggerInterface名稱使用了singleton的單例綁定模式,如果存在$this->monologConfigurator則優先使用,否則使用默認的Logger。

Sentry接入導致阿里雲日誌失效問題排查

大家可能會疑問,開始講的不是log嗎,怎麼跳出一個Psr\\Log\\LoggerInterface?

在Laravel\\Lumen\\Application.php框架核心代碼中,$this->aliases(見Line:804)有一些框架默認的別名映射關係,其中'log'-> 'Psr\\Log\\LoggerInterface'。

Sentry接入導致阿里雲日誌失效問題排查

解決方案

將SentryServiceProvider的註冊放於AliyunLogProvider之後。


分享到:


相關文章: