에러와 로깅(Errors & Logging)

설정

애플리케이션의 로그 기능은 Illuminate\Foundation\Bootstrap\ConfigureLogging 부트스트랩 클래스에서 설정됩니다. 이 클래스는 config/app.php 설정 파일의 log 옵션을 참조합니다.

기본적으로 로거는 일단위 로그 파일을 기록하도록 설정되어 있습니다만 필요한경우 이 주기를 변경할 수 있습니다. 라라벨은 인기있는 Monolog 로깅 라이브러리를 사용하고 있으므로, Monolog가 제공하는 다양한 핸들러를 이용할 수 있습니다.

예를 들어, 일별로 기록되는 로그 파일 대신 하나의 로그 파일을 구성하고 싶다면 config/app.php 설정파일을 다음과 같이 변경하면 됩니다:

'log' => 'single'

별다른 구성이 없이도 라라벨은 single, daily, syslog 그리고 errorlog 로깅 모드를 지원합니다. 그러나 응용 프로그램에 대한 로깅을 원하는대로 사용자 정의하고자 한다면, ConfigureLogging 부트스트랩 클래스를 재정의 하여 사용할 수도 있습니다.

오류의 상세정보

config/app.php 설정 파일의 app.debug 설정 옵션을 통해서 브라우저에 출력되는 애플리케이션의 오류 정보를 제어 할 수 있습니다. 기본적으로 이 옵션은 .env 파일에 설정되어있는 APP_DEBUG 환경 변수를 반영하도록 설정되어 있습니다.

로컬 개발환경을 구성중이라면 APP_DEBUG 환경 변수를 true로 구성해야 할것입니다. 실제 제품 구동 환경이라면, 이 값은 항상 false가 되어야 할것입니다.

에러 처리

모든 예외-exceptions은 App\Exceptions\Handler 클래스에 의해서 처리됩니다. 이 클래스는 reportrender 메소드로 구성되어 있습니다.

report메소드는 예외-exceptions를 로깅하거나 BugSnag와 같은 별도의 외부 서비스로 보내는데 사용되어 집니다. 기본적으로 report 메소드는 예외-exception가 기록되는 경우 간단하게 부모 클래스의 기본 구현체에 예외-exception를 전달합니다. 그렇지만 예외-exceptions을 원하는대로 로깅해도 됩니다. 만약 각 예외-exception 유형을 각기 다른 방법으로 기록 할 필요가 있다면, PHP의 instanceof 비교 연산자를 사용하면 됩니다:

/**
 * Report or log an exception.
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param  \Exception  $e
 * @return void
 */
public function report(Exception $e)
{
    if ($e instanceof CustomException)
    {
        //
    }

    return parent::report($e);
}

render 메소드는 예외-exception를 HTTP 응답으로 변환하고 브라우저에게 보내는 역할을 담당합니다. 기본적으로 예외-exception는 응답을 생성하는 기본 클래스로 전달됩니다. 하지만 예외-exception의 유형을 파악하고 사용자 지정된 응답을 반환 것도 자유롭습니다.

예외-exception 처리 클래스의 dontReport 속성에 배열로 지정된 유형들은 로그를 남기지 않습니다. 기본적으로 404 에러는 로그파일에 기록되지 않습니다. 필요한 경우에 다른 예외-exception 유형들도 이 배열에 추가할 수 있습니다.

HTTP 예외-exceptions

어떤 예외들-exceptions은 서버에서 발생하는 HTTP 에러 코드를 나타냅니다. 예를 들어, "페이지를 찾을 수 없습니다." 에러(404)나, 인증 오류 (401) 또는 개발자가 유발하는 500 오류 같은 것들입니다. 이 같은 응답을 반환하려면 다음과 같이 수행하십시오:

abort(404);

선택적으로, 응답을 제공할 수 있습니다.

abort(403, 'Unauthorized action.');

이 메소드는 요청의 라이프사이클 동안이면 언제든지 사용할 수 있습니다.

404 에러의 사용자 정의 페이지

모든 404에러들을 위한 사용자 정의 뷰를 반환하기 위해서는 resources/views/errors/404.blade.php 파일을 만들어야 합니다. 이 뷰파일은 애플리케이션에 의해 발생하는 모든 404 에러에 사용됩니다.

로깅

라라벨의 로그 기능은 강력한 Monolog 라이브러리위에 간단한 레이어를 제공합니다. 기본적으로 라라벨은 일별 로그 파일을 생성하도록 설정되어 있고, 로그 파일들은 storage/logs에 저장됩니다. 다음과 같이 하여 로그에 정보를 기록할 수도 있습니다:

Log::info('This is some useful information.');

Log::warning('Something could be going wrong.');

Log::error('Something is really going wrong.');

로그는 RFC 5424에 정의되어있는 debug, info, notice, warning, error, critical, 그리고 alert의 7가지 로깅 레벨을 제공합니다.

컨텍스트 데이터 배열도 로그 메소드에 전달할 수 있습니다.

Log::info('Log message', ['context' => 'Other helpful information']);

Monolog에는 로그에 사용할 수있는 기타 다양한 핸들러가 준비되어 있습니다. 필요하다면 라라벨이 내부에서 사용하는 Monolog 인스턴스에 액세스 할 수 있습니다:

$monolog = Log::getMonolog();

로그에 전달되는 모든 메시지를 잡기 위해 이벤트를 등록 할 수도 있습니다:

로그 리스너 등록하기

Log::listen(function($level, $message, $context)
{
    //
});