APISIX의 http-logger 플러그인으로 간편한 로그 수집

Qi Guo

Qi Guo

April 11, 2024

Technology

소개

현대 소프트웨어 개발에서 API 호출 로깅은 애플리케이션의 각 API 호출에 대한 상세 정보를 기록하는 필수적인 부분입니다. 효과적인 로그 관리는 개발 팀이 API 호출 활동을 실시간으로 모니터링하고, 문제를 신속하게 감지하고 해결할 수 있도록 돕습니다. 기업 내에는 이미 성숙한 로깅 시스템 솔루션이 존재하지만, 개발자들은 초기 테스트 서비스의 로그를 내부 로깅 시스템에 통합하는 과정에서 권한 제한 및 승인 절차로 인해 어려움을 겪을 수 있으며, 이는 개발 효율성을 저해할 수 있습니다.

Apache APISIX에서 제공하는 http-logger 플러그인은 HTTP 서버와의 통합을 용이하게 하며, 널리 채택된 HTTP 프로토콜을 사용하여 로그를 수신합니다. 이를 통해 개발자들은 API 호출 로그를 직접 쉽게 확인할 수 있어 개발 효율성을 높일 수 있습니다. 아래에서는 이 플러그인의 작동 원리와 사용 방법을 소개하겠습니다.

http-logger 플러그인의 원리

APISIX의 http-logger 플러그인은 로그 데이터를 HTTP 또는 HTTPS 서버로 푸시하는 것을 지원합니다. 이 플러그인의 핵심 원리는 클라이언트가 요청을 시작하면 APISIX가 이를 처리하고 접근 로그를 생성한 후, 지정된 로그 형식에 따라 요청 컨텍스트 정보를 JSON 객체로 포맷하여 POST 요청을 통해 구성된 HTTP 또는 HTTPS 서버로 비동기적으로 전송하는 것입니다. 이를 통해 우리 자신의 HTTP 또는 HTTPS 서비스에서 API 로그 정보를 확인할 수 있어 개발 효율성을 크게 향상시킬 수 있습니다. 아래는 데이터 흐름을 설명하는 플로우차트입니다.

데이터 흐름 다이어그램

로그 수신을 위한 간단한 HTTP 서비스 생성

시장에는 Loggly, Splunk, ELK Stack과 같은 다양한 SaaS 제품 및 오픈소스 솔루션이 존재하지만, 기업 네트워크 내에서 외부 네트워크 접근이 제한될 수 있어 개발 및 테스트 단계에서 어려움을 겪을 수 있습니다. 따라서 로그를 수집하기 위해 간단한 HTTP 서비스를 빠르게 개발할 수 있습니다. 아래는 Node.js를 사용한 예시입니다:

// httpserver.js
const http = require('http');

http.createServer((req, res) => {
    let data = '';
    req.on('data', chunk => {
        data += chunk;
    });
    req.on('end', () => {
        console.log('APISIX Log:', data);
    });

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(`Hello World\n`);
}).listen(3000, () => {
    console.log('Server running at http://localhost:3000/');
});

이 스크립트는 로컬 포트 3000에서 수신 대기하며, 이 서비스 엔드포인트로 전송된 요청의 본문을 출력합니다. 다음 단계를 따라 실행하고 테스트할 수 있습니다:

  1. node httpserver.js를 실행하여 서비스를 시작합니다.

  2. curl -i http://127.0.0.1:3000/ -d '{"name": "Jack"}' 명령어를 사용하여 이 엔드포인트에 접근합니다.

  3. 다음과 유사한 출력을 확인할 수 있습니다:

Server running at http://localhost:3000/
APISIX Log: {"name": "Jack"}

APISIX에서 Http-logger 플러그인 활성화

다음으로, APISIX에서 http-logger 플러그인을 활성화하고 이전 단계에서 생성한 HTTP 서비스로 로그를 전송하는 방법에 대해 논의하겠습니다.

  1. APISIX Admin API를 사용하여 라우트를 생성하고 http-logger 플러그인을 활성화합니다:
curl "http://127.0.0.1:9080/apisix/admin/routes/1" \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
    {
      "uri": "/get",
      "upstream": {
        "type": "roundrobin",
        "nodes": {
          "httpbin.org:80": 1
        }
      },
      "plugins": {
              "http-logger": {
                  "uri": "http://127.0.0.1:3000/"
              }
        }
    }'
  1. curl 명령어를 사용하여 APISIX에 요청을 전송합니다: curl -i http://127.0.0.1:9080/get

  2. 터미널에서 다음과 유사한 로그 출력을 확인할 수 있습니다.

http-logger 플러그인 활성화 로그 출력

APISIX에서 전송한 로그를 성공적으로 수집한 것을 확인할 수 있습니다.

로그 형식 사용자 정의

http-logger 플러그인은 개발자가 다양한 요구 사항을 충족하기 위해 로그 형식을 사용자 정의할 수 있도록 합니다. 로그 데이터의 특정 필드만 관심이 있다면, APISIX는 로그 형식과 내용을 선언하는 것을 지원합니다. 이는 APISIX가 제공하는 플러그인 메타데이터를 설정하여 달성할 수 있습니다.

1. Admin API를 통해 플러그인 메타데이터를 구성합니다:

curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/http-logger \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "log_format": {
        "host": "$host",
        "@timestamp": "$time_iso8601",
        "client_ip": "$remote_addr"
    }
}'
  1. curl 명령어를 다시 실행하면 다음과 유사한 로그 출력을 확인할 수 있습니다:
APISIX Log: [{"service_id":"a869a037-27df-4278-ab50-4e66d212cfc0","client_ip":"192.168.65.1","host":"127.0.0.1","route_id":"4f499953-9504-4737-9f3d-facaeda4b841","@timestamp":"2024-04-10T00:10:31+00:00"}]

결론

http-logger 플러그인을 활용함으로써 개발자들은 로그 확인 과정을 단순화할 뿐만 아니라 일상적인 개발 효율성을 향상시킬 수 있습니다. 이 플러그인은 APISIX가 제공하는 가장 간단하고 사용자 친화적인 로깅 플러그인으로, 네트워크 전송을 위해 보편적으로 채택된 HTTP 프로토콜을 기반으로 작동합니다. 이를 통해 개발자들은 어떤 HTTP 서비스와도 원활하게 통합하고 로그 수신 서비스를 유연하게 선택할 수 있습니다.

또한, APISIX는 다양한 시나리오에서의 다양한 요구 사항을 충족하기 위해 수십 개의 로깅 플러그인을 지원합니다. 간단한 HTTP 로그 수집부터 복잡한 로그 분석모니터링, 그리고 고성능 및 안정성 요구 사항까지, APISIX는 포괄적인 지원을 제공하여 사용자에게 더 편리하고 효율적인 시스템을 구축할 수 있도록 돕습니다.

Tags: