'F1']); * ───────────────────────────────────────────────────────────────── */ define('API_LOG_FILE', __DIR__ . '/logs/api.log'); define('API_LOG_MAX_BYTES', 512 * 1024); // 512KB 초과 시 rotate /** * 로그 한 줄 기록 * @param string $tag 태그 (파일명/기능명) * @param string $message 메시지 * @param array $context 추가 데이터 (선택) */ function api_log(string $tag, string $message, array $context = []): void { $logDir = dirname(API_LOG_FILE); if (!is_dir($logDir)) { @mkdir($logDir, 0755, true); // 디렉토리 직접 접근 차단 @file_put_contents($logDir . '/.htaccess', "Deny from all\n"); } // 512KB 초과 시 rotate (이전 로그 보존) if (file_exists(API_LOG_FILE) && filesize(API_LOG_FILE) > API_LOG_MAX_BYTES) { @rename(API_LOG_FILE, API_LOG_FILE . '.' . date('YmdHis') . '.bak'); } $ts = date('Y-m-d H:i:s'); $ctx = empty($context) ? '' : ' ' . json_encode($context, JSON_UNESCAPED_UNICODE); $line = "[{$ts}] [{$tag}] {$message}{$ctx}" . PHP_EOL; @file_put_contents(API_LOG_FILE, $line, FILE_APPEND | LOCK_EX); }