這篇文章給大家分享的內容是關於Laravel5.5中如何自訂日誌行為的解析,內容很詳細,有一定的參考價值,希望可以幫助到有需要的朋友。
在Laravel 5.6 版本中日誌行為可以很容易的進行自定義,而在5.5以下版本中日誌行為自訂自由度並不是很高,但是專案有需求不能因為這個就強行將專案升級為5.6吧,況且作為一個穩定的專案升級框架大版本有可能會有很多坑,基於這些原因我嘗試了對Laravel 5.5 的日誌進行改造以適應我的需求。
Laravel 的日誌行為大部分是在Illuminate\Log\LogServiceProvider 中,我們可以看一下其中的程式碼片段:
/** * Configure the Monolog handlers for the application. * * @param \Illuminate\Log\Writer $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)); }
既然我們知道了它們是如何生效的,那麼我們將這兩個類別繼承並修改其中我們需要改變的行為進行改造,我的改造方式如下。在app\Providers 中新建LogServiceProvider 類別繼承Illuminate\Log\LogServiceProvider ,程式碼如下:
<?php namespace App\Providers; use Illuminate\Log\LogServiceProvider as BaseLogServiceProvider; use Illuminate\Log\Writer; class LogServiceProvider extends BaseLogServiceProvider { /** * Configure the Monolog handlers for the application. * * @param \Illuminate\Log\Writer $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 類別繼承Illuminate\Foundation\Application 類,重寫registerBaseServiceProviders 方法。
<?php /** * Created by PhpStorm. * User: dongyuxiang * Date: 2018/7/31 * Time: 16:53 */ namespace App\Foundation; use App\Providers\LogServiceProvider; use Illuminate\Events\EventServiceProvider; use Illuminate\Routing\RoutingServiceProvider; use Illuminate\Foundation\Application 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 。
然後在 bootstrap\app.php 中將變數 $app 的 new 物件換成我們繼承重寫後的。
$app = new App\Foundation\Application( realpath(__DIR__.'/../') );
這樣我就成功的將日誌路徑可以隨便定義了,而且來說有了這次經驗我對於框架不符合我需求的地方可以做更進一步的優化以符合我的要求,而且我沒有更改框架底層的程式碼,當框架有bug修復的時候我也可以放心的進行框架更新。
相關文章推薦:
以上是Laravel5.5中如何自訂日誌行為的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!