この記事の内容は、Laravel5.5 でのログの動作をカスタマイズする方法の分析を共有することです。内容は非常に詳細であり、困っている友人に役立つことを願っています。
Laravel 5.6 バージョンではログの動作を簡単にカスタマイズできますが、5.5 未満のバージョンではログの動作をカスタマイズする自由度はあまり高くありませんが、プロジェクトにニーズがある場合、プロジェクトを強制的にアップグレードすることはできません5.6 は安定したプロジェクトであるため、フレームワークの大きなバージョンをアップグレードすると多くの落とし穴がある可能性があるため、Laravel 5.5 のログをニーズに合わせて変換しようとしました。
Laravel のログ動作は主に IlluminateLogLogServiceProvider で行われます。コード スニペットを見てみましょう。
/** * 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)); }
それらがどのように有効になるかがわかったので、これら 2 つのクラスを継承し、変更する必要がある動作を次のように変更します。 IlluminateLogLogServiceProvider を継承する新しい LogServiceProvider クラスを appProviders に作成します。 コードは次のとおりです:
<?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 ディレクトリを作成し、新しいアプリケーションを作成します。 IlluminateFoundationApplication クラスを継承するクラスを作成し、 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)); } }
書き換えると言われてますが、実際には自分で作成したLogServiceProviderから使用クラスを変更しただけです。
次に、bootstrapapp.php で、変数 $app の新しいオブジェクトを、継承して書き換えたオブジェクトに置き換えます。
$app = new App\Foundation\Application( realpath(__DIR__.'/../') );
このように、何気なくログパスを定義することに成功し、この経験を活かして、フレームワークの要件を満たさない部分をさらに最適化して要件を満たすことができ、フレームワークを変更することはありませんでした。基礎となるコードにバグ修正がある場合、フレームワークを安全に更新できます。
おすすめ関連記事:
以上がLaravel5.5でログ動作の分析をカスタマイズする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。