건강한 몸을 위해서는 조깅을, 건강한 시스템을 위해서는 로깅을!
우리는 매일 조깅(jogging)을 합니다. 물론 하루 정도 조깅을 하지 않더라도, 그 날 하루를 지내는데는 큰 문제가 없습니다. 하지만 횟수가 지날 수록, 우리의 걸음은 느려지며 조금만 걸어도 숨이 가슴턱까지 차오르기 마련입니다.
개발도 마찬가지입니다. 우리는 매일 로깅(logging)을 합니다. 물론 프로그램 하나 정도는 로깅을 하지 않더라도, 그 날 하루 정도는 시스템을 서비스하는데 지장이 없습니다. 하지만 달이 바뀔 수록, 시스템의 처리 속도는 느려지며 조금만 부하를 줘도 CPU와 메모리가 90%까지 차오르기 마련입니다.
크몽 개발팀도 건강한 시스템을 위해서 하루하루 로깅을 활용하기 시작했습니다. 오늘은 바로 이 로깅에 대한 이야기를 하려고 합니다.
PHP 로깅 프레임워크
다양한 PHP 로깅 프레임워크가 있지만, 그 중에서도 4가지만 뽑아보았습니다.
- KLogger작고 가벼운 반면, 파일로만 로깅을 할 수 있습니다.
- Zend_LogZend 프레임워크에 포함된 로깅 모듈입니다. 이미 Zend를 사용중이라면, 고민할 필요가 없습니다.
- Monolog콘솔, 데이터베이스, 이메일 등 다양한 형태로 로깅을 출력할 수 있으며, 로그 포맷을 설정할 수 있는 내장 포맷터를 지원합니다. 굳이 단점을 뽑자면, PHP 5.3 이상을 필요로 합니다.
- Apache Log4PHP아파치 재단의 Log4 시리즈 중 PHP 버전입니다. 다양한 기능을 지원하는 반면, 약간 무겁습니다. 하지만 Log4 시리즈 중 하나에 익숙하다면, 쉽게 사용할 수 있습니다.
Log4PHP
크몽 개발팀은 Apache Log4PHP를 선택했습니다. 개발팀 모두가 자바 진영에서 시작했기 때문에, Log4J에 익숙했기 때문입니다.
로깅 레벨
로깅 레벨이란 로깅 메시지의 심각도(severity)를 뜻합니다. 나머지 로깅 프레임워크와 비슷하게 Log4PHP에서도 아래 6가지의 로깅 레벨을 지원합니다.
레벨 | 심각도 | 설명 |
FATAL | 높음 | 전체 시스템을 중단할 수 있을 정도로 위험한 이벤트 |
ERROR | … | 특정 부분에 에러가 발생한 경우.시스템의 나머지 부분은 정상적으로 실행 가능 |
WARN | … | 경고 이벤트.전체 시스템에 영향은 없지만, 문제가 발생할 소지가 있다. |
INFO | … | 시스템 자체에서 의미 있는 이벤트 |
DEBUG | … | 프로그램을 디버깅할 때 의미 있는 이벤트 |
TRACE | 낮음 | 시스템의 실행과정을 추적할 수 있는 모든 이벤트 |
설치하기
아파치 log4php 사이트에서 최신 버전의 설치파일을 다운로드 합니다. 압축 파일이므로, 압축을 해제 합니다. 설치파일의 디렉토리 구조는 다음과 같습니다.
[divide]
|— apdics/ – API 문서
|— src/
|— assembly/ – 메이븐 어셈블리 설정
|— chagens/ – chage 로그
|— examples/ – 사용 예제
|— main/
|— php/ – 메인 소스 코드
|— site/ – 웹 사이트 소스
|— test/ – 단위 테스트
[divide]
실행할 때 필요한 파일들은 모두 src/main/php 디렉토리에 위치합니다. 여러분의 어플리케이션의 라이브러리 디렉토리에 {LOG4_PHP_HOME}를 만들고, src/main/php 하위의 파일들을 복사하면, 설치는 끝입니다.
설정하기
설정은 여러가지 방식으로 할 수 있지만 대개의 경우 XML을 사용합니다. config.xml 파일을 {LOG4_PHP_HOME} 디렉토리에 하나 만듭니다. 설정 파일에는 로깅을 어디에, 어떤 포맷으로, 어느 로깅 레벨로 할지를 정의하며, 이러한 정보는 Appender 모듈을 사용합니다. 예를 들어 아래는 콘솔로 출력하며, 로깅 레벨은 WARN으로, 기본 로그 포맷을 사용하도록 설정하는 예제입니다.
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="myAppender" class="LoggerAppenderConsole"/>
<root>
<level value="WARN" />
<appender_ref ref="myAppender" />
</root>
</configuration>
그러면 실전에 앞서, 디버깅 메시지는 콘솔로, 정보 메시지는 파일로 출력하도록 설정해보겠습니다.
<configuration xmlns="http://logging.apache.org/log4php/">
<appender name="myConsoleAppender" class="LoggerAppenderConsole" />
<appender name="myFileAppender" class="LoggerAppenderDailyFile">
<layout class="LoggerLayoutPattern">
<param name="conversionPattern" value="%date [%logger] [%level] %message%newline" />
</layout>
<param name="datePattern" value="Y-m-d" />
<param name="file" value="/var/httpd/logs/web.log-%s.log" />
</appender>
<root>
<level value="DEBUG" />
<appender_ref ref="myConsoleAppender" />
</root>
<logger name="myLogger">
<level value="INFO" />
<appender_ref ref="myFileAppender" />
</logger>
</configuration>
기본 루트 로거는 간단히 콘솔로 출력하도록 했습니다. 그리고 myLogger는 하루를 주기로 롤링되도록, LoggerAppenderDailyFile 를 사용했습니다.
로깅하기
로깅을 하려면 먼저 Log4PHP 라이브러리를 로드한 후, 로거 객체를 만들어야 합니다.
// libraries/apache-log4php-2.3.0/Logger.php를 include 한 후,
Logger::configure('libraries/apache-log4php-2.3.0/config.xml');
$myLogger = Logger::getLogger("myLogger");
로거 객체가 생성되면, 상황에 맞게 로깅 레벨을 선택하여 로깅을 할 수 있습니다. 각 로그 레벨에 맞게 로깅 메서드가 지원됩니다. 예를 들어 다음과 같습니다.
$myLogger->debug("..............");
$myLogger->info("..............");
$myLogger->warn("..............");
앞으로
로그 데이터는 에러가 발생했을 때 원인을 찾거나, 추적하기 위한 용도로 많이 사용됩니다. 하지만 더 나아가서 로그 데이터를 분석하면 가치 있는 정보를 얻을 수 있는 경우가 많습니다. 크몽에서도 재능 거래 데이터와 로그 데이터를 분석하여, 사용자 맞춤형 재능 추천 시스템을 만들기 위해 설계 중에 있습니다. 다음 번에는 재능 추천 알고리즘 소개로 찾아뵙겠습니다~.