현재 위치: > 최신 기사 목록> 로그 파일의 IP, 시간 및 기타 필드의 통합 형식

로그 파일의 IP, 시간 및 기타 필드의 통합 형식

M66 2025-05-18

서버 로그 파일을 처리 할 때 종종 일관되지 않은 형식으로 문제가 발생합니다. 예를 들어, IP 주소에는 주요 0, 타임 스탬프 형식이 일치하지 않을 수 있으며 요청 경로에는 다양한 매개 변수가있을 수 있습니다. 이러한 필드를 균일하게 처리하기 위해 preg_replace_callback_array는 다양한 콜백 기능을 여러 정규 표현식에 개별적으로 바인딩하고 트래버스에서 복잡한 교체 로직을 완료 할 수있는 매우 강력한 도구입니다.

이 기사에서는 preg_replace_callback_array를 사용하여 로그의 IP와 시간 필드를 균일하게 포맷하는 방법을 소개합니다.

샘플 로그 형식

다음과 같은 로그 컨텐츠 (단순화 된 버전)가 있다고 가정합니다.

 127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404

우리는 희망 :

  • IP 주소를 정규화합니다 (선행 제로 제거).

  • 시간을 YYYY-MM-DD HH : MM : SS 형식으로 통합;

  • 선택 사항 : 경로에서 마스크 매개 변수, 예를 들어 /index.php?id=123/index.php

preg_replace_callback_array를 사용한 구현

 <?php

$log = <<<LOG
127.000.000.001 - - [21/Apr/2025:15:32:01 +0000] "GET /index.php?id=123 HTTP/1.1" 200
192.168.1.10 - - [21-Apr-2025 15:32:01] "POST /submit.php HTTP/1.1" 404
LOG;

// 정기적이고 해당하는 처리 콜백을 정의하십시오
$patterns = [
    // IP 주소 서식:주요 0을 제거하십시오
    '/\b(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\b/' => function ($matches) {
        return implode('.', array_map('intval', array_slice($matches, 1, 4)));
    },

    // Apache 스타일 타임 스탬프 [21/Apr/2025:15:32:01 +0000]
    '/\[(\d{2})\/(\w{3})\/(\d{4}):(\d{2}):(\d{2}):(\d{2}) [+\-]\d{4}\]/' => function ($matches) {
        $monthMap = [
            'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
            'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
            'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
        ];
        return sprintf('%s-%s-%s %s:%s:%s',
            $matches[3],                         // 년도
            $monthMap[$matches[2]] ?? '01',     // 달
            $matches[1],                         // 낮
            $matches[4], $matches[5], $matches[6]
        );
    },

    // 낮志格式中另一种时间 [21-Apr-2025 15:32:01]
    '/(\d{2})-(\w{3})-(\d{4}) (\d{2}):(\d{2}):(\d{2})/' => function ($matches) {
        $monthMap = [
            'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
            'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
            'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12'
        ];
        return sprintf('%s-%s-%s %s:%s:%s',
            $matches[3],
            $monthMap[$matches[2]] ?? '01',
            $matches[1],
            $matches[4], $matches[5], $matches[6]
        );
    },

    // 제거하다 URL 매개 변수(좋다 /index.php?id=123 → /index.php)
    '#(GET|POST|PUT|DELETE|HEAD) (/[\w\-\/\.]+)(\?[^\s"]*)?#' => function ($matches) {
        return $matches[1] . ' ' . $matches[2];
    }
];

// 응용 프로그램 교체
$formatted = preg_replace_callback_array($patterns, $log);

// 출력 결과
echo nl2br(htmlspecialchars($formatted));
?>

출력 결과

위의 스크립트를 실행하면 로그 컨텐츠가 다음과 같이 형식화됩니다.

 127.0.0.1 - - 2025-04-21 15:32:01 "GET /index.php HTTP/1.1" 200  
192.168.1.10 - - 2025-04-21 15:32:01 "POST /submit.php HTTP/1.1" 404

요약

preg_replace_callback_array를 사용하면 매우 우아한 방식으로 로그에서 여러 형식의 여러 필드를 처리 할 수 ​​있습니다. 이 장점은 여러 모드를 한 번에 처리한다는 것입니다. 각 모드에는 고유 한 콜백 기능이 독립적으로 있으며, 이는 명확한 논리와 유지 보수가 쉽습니다.