기존에 개발되어 오랫동안 사용 중인 백오피스가 PHP 5.4 기반의 유물같은(?) 소스코드로 되어있다. 뜯어고치거나 새로 만들 수가 없는 상황이라 할 수 없이 이어서 유지보수를 하고 있는 중인데, 디버깅할 일이 점차 잦아지고 log를 확인할 일이 많은 것이 당연했다.
원래는 로깅을 위해 error_log
함수를 사용하다가 너무 불편해서 아래처럼 함수를 하나 만들었지만
if(!function_exists('myLog')){
function myLog($fileName, $tag, $msg, $daily = true) {
$logDir = __DIR__.'/../log';
if(!is_dir($logDir)){
mkdir($logDir);
}
$logFile = $logDir.'/'.$fileName.'_'.date('Ymd').'.log';
if (!$daily) {
$logFile = $logDir.'/'.$fileName.'_'.date('Ym').'.log';
}
if(!is_file($logFile)){
file_put_contents($logFile, '');
}
if (gettype($msg) == 'array') {
$data = json_encode($msg, JSON_UNESCAPED_UNICODE);
} else {
$data = $msg;
}
file_put_contents($logFile, "[".date('H:i:s')."]\n{$tag} : {$data}\n", FILE_APPEND);
}
}
사용하다보니 이것도 그다지 스마트한 방식이 아니라는 것을 금새 깨달았다.
일단 넘겨야하는 인자가 많고 순서도 헷갈린다.
PHP에서 가장 효율적인 로깅 방법이 무엇일까를 찾다가 아래의 글을 발견했다.
How to Get Started with Logging in PHP
그리고 Monolog 패키지를 사용하기로 결정했다.
막상 Monolog 패키지를 설치하고 사용하려는데, 문제가 있었다.
일단 나는 기존 소스코드를 최대한 적게 수정하고 싶었다. 그리고 가능한 기존의 로깅 파일 체계는 유지하고자 했다.
그러자니 Monolog 패키지를 그대로 가져와서 쓰려고하면 파일마다 적어도 아래처럼 4줄 짜리 코드가 추가되어야 했다.
$log = new Logger("my_logger");
$stream_handler = new StreamHandler(__DIR__ . "/log/debug.log", Level::Debug);
$log->pushHandler($stream_handler);
$log->debug("This is a debug message.");
Laravel 프레임워크에서 처럼 간단하게 사용하려고 시작한 건데, 파일마다 4줄을 추가할 순 없었다.
일단 현재 사용 중인 로깅 방식을 내 마음대로 완전히 바꿀 수도 없고, 그럴 의도는 아니었기 때문에
1. 파일명, 로깅 주기를 지정할 수 있어야 한다.
2. Tag 를 쓸 수 있어야 한다.
이 두 가지의 자유도를 유지해야 했다.
그래서 아래와 같이 Monolog의 Logger를 확장한 클래스를 작성해 보았다.
require "/vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Formatter\LineFormatter;
class myLogger extends Logger {
public $handler;
// 기본 핸들러, 포맷셋팅
public function set($file, $time, $lv="debug") {
switch ($lv) {
case 'debug':
$level = Logger::DEBUG;
break;
case 'info':
$level = Logger::INFO;
break;
case 'error':
$level = Logger::ERROR;
break;
default:
$level = Logger::DEBUG;
break;
}
$this->handler = new RotatingFileHandler($file, $time, $level);
$this->setFormat();
Logger::pushHandler($this->handler);
}
// 기본 monolog 형식 출력시 맨 뒤에 [] 이렇게 붙는 부분 제거하기 위함
public function setFormat() {
$this->handler->setFormatter(new LineFormatter(NULL, NULL, true, true));
}
}
그리고 공통으로 사용되는 라이브러리 파일에 이 클래스를 추가하고 기존에 error_log
를 사용하던 파일에서는 아래와 같이 변경했다.
$log = new myLogger("Order");
$log->set("../../log/order.log", 30);
$log->info("태그", ["출력내용"]);
하지만 이것도 역시 3줄이나 추가해야 해서 번거롭긴 마찬가지인데, 이건 기존 시스템에서 파일별로 다 다르게 로깅을 하기 때문이고
그런 상황이 아니라면 공통으로 사용하는 파일에 set
까지만 실행해주고 아래처럼 한 줄만 사용하면 된다.
$log->info("태그", ["출력내용"]);
이렇게 해서 PHP 5 버전 레거시 코드를 사용 중인 환경에서 Monolog 패키지를 간편하게 사용할 수 있게 되었다.
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.