這篇文章給大家分享的內容是關于laravel5.5中如何自定義日志行為的解析,內容很詳細,有一定的參考價值,希望可以幫助到有需要的朋友。
在 laravel 5.6 版本中日志行為可以很容易的進行自定義,而在5.5以下版本中日志行為自定義自由度并不是很高,但是項目有需求不能因為這個就強行將項目升級為5.6吧,況且作為一個穩定的項目升級框架大版本有可能會有很多坑,基于這些原因我嘗試了對 Laravel 5.5 的日志進行改造以適應我的需求。
Laravel 的日志行為大部分是在 IlluminateLogLogServiceProvider 中,我們可以看一下其中的代碼片段:
/** ?*?Configure?the?Monolog?handlers?for?the?application. ?* ?*?@param?IlluminateLogWriter?$log ?*?@return?void ?*/ protected?function?configureDailyHandler(Writer?$log) { ?$log->useDailyFiles( ??$this->app->storagePath().'/logs/laravel.log',?$this->maxFiles(), ??$this->logLevel() ?); }
這是我最常在項目中使用的日志存儲方式,可以看到日志的存儲路徑幾近與寫死的狀態,無法通過外部參數輕易的更改。
最開始我想的是重寫這個 Provider 然后將其注冊到 app.php 的 providers 數組中,但是這種行為并不可行,因為通過查看源碼, LogServiceProvider 是在框架啟動時就注冊。
有這樣一個方法控制了這個注冊行為:
protected?function?registerBaseServiceProviders() { ?$this->register(new?EventServiceProvider($this)); ?$this->register(new?LogServiceProvider($this)); ?$this->register(new?RoutingServiceProvider($this)); }
既然我們知道了它們是如何生效的,那么我們將這兩個類繼承并修改其中我們需要改變的行為進行改造,我的改造方式如下。在 appProviders 中新建 LogServiceProvider 類繼承 IlluminateLogLogServiceProvider ,代碼如下:
<?php namespace AppProviders; use IlluminateLogLogServiceProvider as BaseLogServiceProvider; use IlluminateLogWriter; class LogServiceProvider extends BaseLogServiceProvider { /** * Configure the Monolog handlers for the application. * * @param IlluminateLogWriter $log * @return void */ protected function configureDailyHandler(Writer $log) { $path = config('app.log_path'); $log->useDailyFiles( ???$path,?$this->maxFiles(), ???$this->logLevel() ??); ?} }
在 config/app.php 目錄中添加配置:
'log_path'?=>?env('APP_LOG_PATH',?storage_path('/logs/laravel.log')),
app 目錄中新建 Foundation 目錄,新建 Application 類繼承 IlluminateFoundationApplication 類,重寫 registerBaseServiceProviders 方法。
<?php /** * Created by PhpStorm. * User: dongyuxiang * Date: 2018/7/31 * Time: 16:53 */ namespace AppFoundation; use AppProvidersLogServiceProvider; use IlluminateEventsEventServiceProvider; use IlluminateRoutingRoutingServiceProvider; use IlluminateFoundationApplication as BaseApplication; class Application extends BaseApplication { /** * Register all of the base service providers. * * @return void */ protected function registerBaseServiceProviders() { $this->register(new?EventServiceProvider($this)); ??$this->register(new?LogServiceProvider($this)); ??$this->register(new?RoutingServiceProvider($this)); ?} }
說是重寫其實只是將use類換從了我們自己創建的 LogServiceProvider 。
然后在 bootstrapapp.php 中將變量 $app 的 new 對象換成我們繼承重寫后的。
$app?=?new?AppFoundationApplication( ?realpath(__DIR__.'/../') );
這樣我就成功的將日志路徑可以隨便定義了,而且來說有了這次經驗我對于框架不符合我需求的地方可以做更進一步的優化以符合我的要求,而且我沒有更改框架底層的代碼,當框架有bug修復的時候我也可以放心的進行框架更新。
相關文章推薦: