라라벨 시작하기 12 – 로그

사용하기는 쉽다.

use Illuminate\Support\Facades\Log;

를 상단에 선언해주고 하단에

Log::info('Log');

형태로 작성해주면 된다.

그럼 이렇게 로그가 생긴다.로그로테이트는 daily 채널을 사용하자.

추가로 해당 클래스 또는 함수명을 출력해주도록 하는건 나중에 추가한다.

로그에 함수명, 클래스명을 출력하기

이렇게 하고 싶은 이유는 스프링의 로그가 이렇게 되어있었기 때문이다. 그리고 이렇게 하면 꽤나 도움을 많이 받았다.

CustomFormatter를 만들자

나는 daily 체널을 그대로 활용하고 싶었다. 그리고 최대한 제공하는걸 사용하고 싶어 커스터마이징을 따라서 tab에 포메터를 추가하고 싶었다. 그런데 이게 작동을 하지 않는다. 작동하지 않았던 이유는 마지막에…

하는수 없이 프로바이더에 커스텀로그서비스를 추가하였다.(feat, ChatGPT)

class CustomFormatter implements FormatterInterface {
    public function format($record): string {
        // 디버그 백트레이스에서 클래스와 함수명 추출
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
        $caller = isset($trace[2]) ? $trace[2] : null;
        $class = $caller['class'] ?? 'N/A';
        $function = $caller['function'] ?? 'N/A';

        // 로그 메시지 포맷
        return sprintf(
            "[%s] %s: [%s::%s] %s\n",
            $record['datetime']->format('Y-m-d H:i:s'),
            strtoupper($record['level_name']),
            $class,
            $function,
            $record['message']
        );
    }

    public function formatBatch(array $records): array {
        return array_map([$this, 'format'], $records);
    }
}

그런데 이렇게 하니 문제가 발생. 당연하게도 Logger 그자체를 출력해버림. 이번엔 Logger를 제외한 첫번째 클래스를 찾아서 출력하라고 했더니 별반 다르지 않는 코드를 줬다.

대강 $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 6); 3에서 6으로 늘었다. xdebug로 뭘 출력하는지 알아봤다. 전체 stack trace를 출력하는걸 확인했다. 뒤에 숫자는 몇 번째까지 출력하는지 지정하는거였다.

결국 최종 원하는 결과물을 얻을 수 있는 코드는 다음과 같았다.

<?php
namespace App\Logging;

use Monolog\Formatter\FormatterInterface;

class CustomTabFormatter implements FormatterInterface {
    public function format($record): string {
        // 클래스와 함수명을 포함한 로그 메시지 포맷
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 9);
        $caller = isset($trace[8]) ? $trace[8] : null;
        $class = $caller['class'] ?? 'N/A';
        $function = $caller['function'] ?? 'N/A';

        $message = sprintf(
            "[%s] %s\t[%s::%s]\t%s\n",
            $record['datetime']->format('Y-m-d H:i:s'),
            $record['level_name'],
            $class ?? 'N/A',
            $function ?? 'N/A',
            $record['message'],
        );

        return $message;
    }

    public function formatBatch(array $records): array {
        return array_map([$this, 'format'], $records);
    }
}

그런데 이 코드, 성능이슈가 있을 수 있다. debug옵션에서만 쓰던지 해야지.

오늘은 여기까지.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다