이 글의 내용은 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의 공급자 배열에 등록하려고 생각했지만 소스 코드를 보면 프레임워크가 시작될 때 LogServiceProvider가 등록되어 있기 때문에 이 동작은 실현 가능하지 않습니다.
이 등록 동작을 제어하는 방법이 있습니다:
protected function registerBaseServiceProviders() { $this->register(new EventServiceProvider($this)); $this->register(new LogServiceProvider($this)); $this->register(new RoutingServiceProvider($this)); }
이제 어떻게 적용되는지 알았으므로 이 두 클래스를 상속하고 변경해야 하는 동작을 다음과 같이 수정하겠습니다. IlluminateLogLogServiceProvider를 상속하는 appProviders에 새 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')),
앱 디렉토리에 새 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!