로깅 정보
Log Levels
log_message()
메소드를 사용하여 로컬 로그 파일에 정보를 기록할 수 있습니다.
첫 번째 매개 변수에 오류의 “수준”을 제공해야 하며 메시지 유형(디버그, 오류 등)을 나타냅니다.
두 번째 매개 변수는 메시지 자체입니다
<?php
if ($some_var === '') {
log_message('error', 'Some variable did not contain a value.');
}
RFC 5424 레벨과 일치하는 8가지 로그 레벨이 있으며 다음과 같습니다.
Level |
Description |
---|---|
debug |
자세한 디버그 정보 |
info |
사용자 로그인, SQL 쿼리 로깅 등과 같은 어플리케이션의 흥미로운 이벤트 |
notice |
어플리케이션에서 정상이지만 중요한 이벤트 |
warning |
사용되지 않는 API 사용, API 사용 불량 또는 반드시 잘못된 것은 아니지만 다른 바람직하지 않은 오류와 같은 예외 발생 |
error |
즉각적인 조치가 필요하지 않지만 일반적으로 기록 및 모니터링되어야하는 런타임 오류 |
critical |
어플리케이션 구성 요소를 사용할 수 없거나 예기치 않은 예외와 같은 중요한 조건 |
alert |
전체 웹 사이트가 다운되거나 데이터베이스를 사용할 수 없는 경우등 즉시 조치를 취해야 하는 경우 |
emergency |
시스템 사용 불가 |
로깅 시스템은 시스템 관리자 또는 웹 마스터에게 이러한 이벤트에 대해 경고하는 방법을 제공하지 않으며 정보만 기록합니다. 보다 중요한 여러 이벤트 수준의 경우 위에서 설명한 오류 처리기가 로깅을 자동으로 수행합니다.
구성
app/Config/Logger.php
구성 파일 내에서 실제로 로깅된 레벨을 수정하고 다른 로거를 지정하여 다른 레벨을 처리할 수 있습니다.
구성 파일의 threshold
값은 어플리케이션에서 기록되는 수준을 결정합니다.
어플리케이션에서 수준을 기록하도록 요청해도 threshold
에 지정된 수준에 따라 기록 할 수 없는 경우 무시됩니다.
로그를 사용하는 가장 간단한 방법은 threshold
값을 최소 수준으로 설정하는 것입니다.
예를 들어 정보 메시지가 아닌 경고(warning) 메시지를 기록하려는 경우 threshold
값을 5
로 설정합니다.
5 이하의 레벨(런타임 오류, 시스템 오류 등)의 모든 로그 요청은 기록되고 정보(info), 알림(notice) 및 디버그(debug)는 무시됩니다.
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Logger extends BaseConfig
{
public $threshold = 5;
// ...
}
전체 레벨 목록과 해당 threshold
값은 참조용 구성 파일에 있습니다.
threshold
값을 특정 레벨로 여러개 선택하여 배열로 지정할 수 있습니다.
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Logger extends BaseConfig
{
// Log only debug and info type messages
public $threshold = [5, 8];
// ...
}
다중 로그 처리기 사용
로깅 시스템은 동시에 실행중인 로깅을 처리하는 여러 가지 방법을 지원할 수 있습니다. 각 처리기는 특정 수준을 처리하고 나머지는 무시하도록 설정할 수 있습니다. 3가지의 핸들러가 기본적으로 설치되어 제공됩니다.
File Handler는 기본 핸들러이며, 매일 로컬로 단일 파일을 작성합니다. 권장되는 로깅 방법입니다.
ChromeLogger Handler는 Chrome 웹 브라우저에 ChromeLogger extension이 설치되어 있다면, Chrome의 콘솔 창에 로그 정보를 표시 할 수 있습니다.
Errorlog Handler 이 핸들러는 PHP의 네이티브
error_log()
함수를 활용하고 거기에 로그를 작성합니다. 현재는error_log()
의0
과4
메시지 유형만 지원됩니다.
핸들러는 로그 구성 파일의 $handlers
속성에 지정할 수 있으며, 핸들러 및 핸들러에 대한 설정값으로 이루어진 배열입니다.
Each handler is specified with the key being the fully name-spaced class name.
각 핸들러의 키는 네임스페이스를 포함한 클래스명(fully name-spaced class name)으로 지정되어야 합니다.
값은 각 핸들러에 따른 다양한 속성을 지정한 배열이 됩니다.
각 핸들러 섹션에는 handles
라는 공통 속성이 있으며, 핸들러가 정보를 기록할 때 사용되는 로그 레벨 수준을 지정한 배열입니다.
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Logger extends BaseConfig
{
public $handlers = [
// File Handler
'CodeIgniter\Log\Handlers\FileHandler' => [
'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
],
];
// ...
}
컨텍스트를 사용하여 메시지 수정
기록되는 이벤트의 컨텍스트에 따라 메시지 세부 사항을 수정하려는 경우가 종종 있습니다. 사용자 ID, IP 주소, 현재 POST 변수등을 기록해야 할 수도 있습니다. 메시지에 자리 표시자를 사용하여 이 작업을 수행 할 수 있습니다. 각 자리 표시자는 중괄호로 묶어야합니다. 세 번째 매개 변수에는 자리 표시자 이름(중괄호없이)에 상응하는 키/값 배열입니다. 이들은 메시지 문자열에 삽입됩니다.
<?php
// Generates a message like: User 123 logged into the system from 127.0.0.1
$info = [
'id' => $user->id,
'ip_address' => $this->request->getIPAddress(),
];
log_message('info', 'User {id} logged into the system from {ip_address}', $info);
예외 또는 오류를 기록할 때 ‘exception’ 키와 값을 예외 또는 오류 자체로 사용할 수 있습니다. 오류 메시지, 파일 이름 및 줄 번호가 포함 된 개체에서 문자열이 생성됩니다. 이를 위해 메시지에 exception 자리 표시자를 제공해야합니다.
<?php
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} |
사용중인 환경변수 이름, 예) development |
{file} |
로거를 호출하는 파일 이름 |
{line} |
로거가 호출 된 {file}의 행 |
{env:foo} |
$_ENV 배열의 ‘foo’ 값 |
타사(third-party) 로거 사용
PSR-3와 호환 가능한 다른 로거를 Psr\Log\LoggerInterface
를 확장하여 사용할 수 있습니다.
즉, PSR-3 호환 로거를 쉽게 사용하거나 직접 생성할 수 있습니다.
시스템에서 타사 로거를 찾을수 있도록 app/Config/Autoload.php
구성 파일에 추가하거나, Composer와 같은 다른 자동 로더를 통해 타사 로거를 찾을 수 있는지 확인해야합니다.
그 다음, 별칭 logger
가 새 클래스 이름으로 가리키도록 app/Config/Services.php
를 수정해야 합니다.
이렇게 하면 log_message()
함수 호출을 통해 수행된 모든 작업은 수정된 새로운 라이브러리를 사용하게 됩니다.