Programming/PHP

웹개발 준비 3 - Codeigniter 가공 : 로그 남기기 수정

minarae7 2014. 12. 19. 16:11
728x90
반응형

Codeigniter에서는 사용로그를 남길 수 있다.


로그 수준에는 Error, Debug, Info, All 이렇게 모두 4가지를 지원한다.


한 가지 아쉬운 것이 있다면 원하는 로그를 선택적으로 남길 수 없다는 것이다. 예를 들어서 Debug 메시지를 안찍고 Info 메시지만 찍고 싶을 수 있지만 이렇게 하는 것이 불가능하다.


Codeigniter는 로그 수준을 Error부터 All까지 1~4로 매핑시킨다. 그리고 설정한 로그 수준보다 낮은 Log를 기록하도록 작성되어 있다.


하지만 Codeigniter가 로딩될 때 각 Core들은 모두 Debug 메시지를 찍기 때문에 내가 원하는 메시지를 확인하기가 어렵다.


그래서 Codeigniter에서 제공하는 Log 함수를 수정하여서 원하는 수준만 로그를 남길 수 있도록 하였다.


먼저 설정부터 보도록 하겠다.


Codeigniter 2.2.0 기준으로 설명하도록 한다.


/application/config/config.php 파일에 로그 관련된 설정들이 들어있다.


183번째 라인을 살펴보면 다음과 같이 작성되어 있다.


$config['log_threshold'] = 0;


이렇게 되어있으면 로그를 남기지 않는다. 만약 여기서 3으로 설정하면 Error, Debug, Info 메시지를 모두 남기게 된다.


Debug 메시지는 빼고 Error 메시지와 Info 메시지만 찍고 싶지만 기본적으로 제공하는 Codeigniter에서는 그런 기능을 지원하지 않는다.


Log 클래스를 수정할 것이므로 필자는 아래와 같이 수정한다.


$config['log_threshold'] = array(1,3);


1은 Error, 3은 Info이다. 이렇게 작성하고 실행하면 아무 기록도 안남는다. Codeigniter에서 숫자가 아니면 무시하기 때문이다.


일단 이 설정은 이렇게 두고 그다음으로 로그를 남길 디렉토리를 지정한다. 바로 아래인 194번째 라인에 기록되어 있다. 기본 값은 /application/logs 이다.


이것을 변경하고자 한다면 다른 디렉토리로 변경하면 된다. 단 반드시 Codeigniter가 설치된 하위디렉토리를 지정하여야 한다. 그리고 www-data(웹 프로세스)가 쓸 권한을 가지고 있어야 한다. 그냥 777로 설정하면 편하다.


다음은 Log 클래스를 수정할 것이다. Log 클래스의 파일은 /system/libraries/Log.php이다.


여기 CI_Log 클래스가 작성되어 있다.


해당 클래스는 두개의 메소드를 갖는다. 생성자(__construct)와 쓰기(write_log) 메소드이다.


두 메소드 모두 조금씩 수정할 것이다.


먼저 __construct 메소드에서 49번째 라인은 다음과 같이 되어있다.


if (is_numeric($config['log_threshold']))
{
	$this->_threshold = $config['log_threshold'];
}


이 코드를 다음과 같이 수정한다.


if (is_numeric($config['log_threshold']) || is_array($config['log_threshold']))
{
	$this->_threshold = $config['log_threshold'];
}


배열일 경우도 할당하고 기록할 수 있도록 하는 것이다.


다음은 로그를 쓰는 부분이다.


write_log 메소드에서 82번째 라인을 살펴보면 다음과 같다.


if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold))
{
	return FALSE;
}


로그 수준이 설정되지 않았거나 현재 로그를 남기고자 하는 수준이 설정수준보다 크다면 로그를 남기지 않고 함수를 종료한다.


위의 코드를 다음과 같이 수정한다.


if ( !isset($this->_levels[$level]))
{
	return FALSE;
}
if ( ( is_array( $this->_threshold ) === false && $this->_levels[$level] > $this->_threshold)
		|| ( is_array($this->_threshold) === true && !in_array($this->_levels[$level], $this->_threshold) ) )
{
	return FALSE;
}


우선 설정이 되어있지 않으면 함수를 종료한다.


그리고 설정이 배열이면 현재 수준이 배열안에 있는지 검사하고 배열이 아니면 이전 코드와 마찬가지로 수준을 비교하여 작지 않으면 메소드를 종료하도록 한다.


이렇게 하면 원하는 수준만 골라서 로그를 남길 수 있도록 된다.

728x90
반응형