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がリクエストを処理し、アクセスログを生成し、指定されたログ形式に従ってフォーマットされたリクエストコンテキスト情報を、POSTリクエストとしてJSONオブジェクトで設定された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: