로깅 정보

log_message() 메서드를 사용하여 로컬 로그 파일에 정보를 기록할 수 있습니다. 첫 번째 매개 변수에 오류의 “수준”을 제공해야 하며 메시지 유형(디버그, 오류 등)을 나타냅니다. 두 번째 매개 변수는 메시지 자체입니다

if ($some_var == '')
{
        log_message('error', 'Some variable did not contain a value.');
}

RFC 5424 레벨과 일치하는 8가지 로그 레벨이 있으며 다음과 같습니다.

  • debug - 자세한 디버그 정보.
  • info - 사용자 로그인, SQL 쿼리 로깅 등과 같은 어플리케이션의 흥미로운 이벤트.
  • notice - 어플리케이션에서 정상이지만 중요한 이벤트.
  • warning - 사용되지 않거나, 잘못된 API 사용과 같이 오류는 아니지만 바람직하지 않은 결과를 초래하는 예외 발생.
  • error - 즉각적인 조치가 필요하지 않지만 일반적으로 기록 및 모니터링되어야하는 런타임 오류.
  • critical - 어플리케이션 구성 요소를 사용할 수 없거나 예기치 않은 예외와 같은 중요한 조건.
  • alert - 전체 웹 사이트가 다운되거나 데이터베이스를 사용할 수 없는 경우등 즉시 조치를 취해야 하는 경우.
  • emergency - 시스템 사용 불가.

로깅 시스템은 시스템 관리자 또는 웹 마스터에게 이러한 이벤트에 대해 경고하는 방법을 제공하지 않으며 정보만 기록합니다. 보다 중요한 여러 이벤트 수준의 경우 위에서 설명한 오류 처리기가 로깅을 자동으로 수행합니다.

구성

/app/Config/Logger.php 구성 파일 내에서 실제로 로깅된 레벨을 수정하고 다른 로거를 지정하여 다른 레벨을 처리할 수 있습니다.

구성 파일의 threshold 값은 어플리케이션에서 기록되는 수준을 결정합니다. 어플리케이션에서 수준을 기록하도록 요청해도 threshold에 지정된 수준에 따라 기록 할 수 없는 경우 무시됩니다. 로그를 사용하는 가장 간단한 방법은 threshold 값을 최소 수준으로 설정하는 것입니다. 예를 들어 정보 메시지가 아닌 디버그 메시지를 기록하려는 경우 threshold 값을 5로 설정합니다. 5 이하의 레벨(런타임 오류, 시스템 오류 등)의 모든 로그 요청은 기록되고 정보(info), 알림(notice) 및 경고(warning)는 무시됩니다.

public $threshold = 5;

전체 레벨 목록과 해당 threshold 값은 참조용 구성 파일에 있습니다.

threshold 값을 특정 레벨로 여러개 선택하여 배열로 지정할 수 있습니다.

// Log only debug and info type messages
public $threshold = [5, 8];

다중 로그 처리기 사용

로깅 시스템은 동시에 실행중인 로깅을 처리하는 여러 가지 방법을 지원할 수 있습니다. 각 처리기는 특정 수준을 처리하고 나머지는 무시하도록 설정할 수 있습니다. 두 개의 핸들러가 기본적으로 설치되어 제공됩니다.

  • File Handler는 기본 핸들러이며, 매일 로컬로 단일 파일을 작성합니다. 권장되는 로깅 방법입니다.
  • ChromeLogger Handler는 Chrome 웹 브라우저에 ChromeLogger extension이 설치되어 있다면, Chrome의 콘솔 창에 로그 정보를 표시 할 수 있습니다.

핸들러는 로그 구성 파일의 $handlers 속성에 지정할 수 있으며, 핸들러 및 핸들러에 대한 설정값으로 이루어진 배열입니다. Each handler is specified with the key being the fully name-spaced class name. 각 핸들러의 키는 네임스페이스를 포함한 클래스명(fully name-spaced class name)으로 지정되어야 합니다. 값은 각 핸들러에 따른 다양한 속성을 지정한 배열이 됩니다. 각 핸들러 섹션에는 handles라는 공통 속성이 있으며, 핸들러가 정보를 기록할 때 사용되는 로그 레벨 수준을 지정한 배열입니다.

public $handlers = [

        //--------------------------------------------------------------------
        // File Handler
        //--------------------------------------------------------------------

        'CodeIgniter\Log\Handlers\FileHandler' => [

                'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
        ]
];

컨텍스트를 사용하여 메시지 수정

기록되는 이벤트의 컨텍스트에 따라 메시지 세부 사항을 수정하려는 경우가 종종 있습니다. 사용자 ID, IP 주소, 현재 POST 변수등을 기록해야 할 수도 있습니다. 메시지에 자리 표시자를 사용하여 이 작업을 수행 할 수 있습니다. 각 자리 표시자는 중괄호로 묶어야합니다. 세 번째 매개 변수에는 자리 표시자 이름(중괄호없이)에 상응하는 키/값 배열입니다. 이들은 메시지 문자열에 삽입됩니다.

// Generates a message like: User 123 logged into the system from 127.0.0.1
$info = [
        'id' => $user->id,
        'ip_address' => $this->request->ip_address()
];

log_message('info', 'User {id} logged into the system from {ip_address}', $info);

예외 또는 오류를 기록할 때 ‘exception’ 키와 값을 예외 또는 오류 자체로 사용할 수 있습니다. 오류 메시지, 파일 이름 및 줄 번호가 포함 된 개체에서 문자열이 생성됩니다. 이를 위해 메시지에 exception 자리 표시자를 제공해야합니다.

try
{
        ... Something throws error here
}
catch (\Exception $e)
{
        log_message('error', '[ERROR] {exception}', ['exception' => $e]);
}

현재 페이지 요청에 따라 자동으로 확장되는 몇 가지 핵심 자리 표시자가 있습니다.

자리 표시자 삽입 된 값
{post_vars} $_POST 변수
{get_vars} $_GET 변수
{session_vars} $_SESSION 변수
{env} 사용중인 환경변수 이름, i.e. development
{file} 로거를 호출하는 파일 이름
{line} 로거가 호출 된 {file}의 행
{env:foo} $_ENV 배열의 ‘foo’ 값

타사(third-party) 로거 사용

PSR3와 호환 가능한 다른 로거를 Psr\Log\LoggerInterface를 확장하여 사용할 수 있습니다. 즉, PSR3 호환 로거를 쉽게 사용하거나 직접 생성할 수 있습니다.

시스템에서 타사 로거를 찾을수 있도록 /app/Config/Autoload.php 구성 파일에 추가하거나, Composer와 같은 다른 자동 로더를 통해 타사 로거를 찾을 수 있는지 확인해야합니다. 그 다음, 별칭 logger가 새 클래스 이름으로 가리키도록 /app/Config/Services.php를 수정해야 합니다.

이렇게 하면 log_message()함수를 호출 통해 수행된 모든 작업은 수정된 새로운 라이브러리를 사용하게 됩니다.

LoggerAware Trait

프레임워크에 독립적인 메서드로 라이브러리를 구현하려는 경우 setLogger() 메서드를 구현하는 CodeIgniter\Log\LoggerAwareTrait를 사용할 수 있습니다. 프레임워크를 위해 다른 환경에서 라이브러리를 사용할 때, PSR3 호환 로거를 찾을 수 있어야 예상한 대로 로깅할 수 있습니다.