您好,登錄后才能下訂單哦!
小編給大家分享一下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以下版本中自定義日志行為的示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。