ログの取得は、WordPressサイトでの問題のトラブルシューティングやデバッグに非常に有用です。Kinstaでは、エラーログ、キャッシュパフォーマンス(kinsta-cache-perf)ログ、アクセスログの3種類を提供しています。

ログにアクセスするには、MyKinstaで「WordPressサイト」>(サイト名)>「ログ」に移動し、「ログビューア」画面を開きます。

また、Kinsta APIの導入により、プログラムでアクセスする方法もあります。代行業者の方は、ログにアクセスするためのインターフェースを独自に構築したり、企業であれば、Slackのようなツールを活用して独自のSlackbotを作成したりすることができます。ボットはスラッシュコマンドを通じてAPIと対話できるため、ログの取得と管理が合理化されます。

この記事では、APIを通じて利用可能なログのエンドポイントとその用途、およびSlack環境内でシームレスにログにアクセスする方法をご紹介していきます。

Kinsta APIとは

Kinsta APIは、WordPress専用マネージドホスティングのようなKinstaサービスとプログラムでやり取りできる強力なツールです。サイトの作成、サイト情報の取得、サイトの稼働状況の取得、バックアップの参照と復元、サイトログの取得など、WordPressの管理に関連するさまざまなタスクを自動化することができます。

KinstaのAPIを使用するには、MyKinstaに少なくとも1つのWordPressサイトアプリケーション、またはデータベースのアカウントが必要になります。また、アカウントを認証してアクセスするためには、APIキーを生成します。

APIキーの生成手順は以下のとおりです。

  1. MyKinstaにログイン
  2. APIキー」画面に移動(画面右上のユーザー名>「企業の設定」>「APIキー」)
  3. APIキーを作成」ボタンをクリック
  4. 有効期限を選択、または独自の有効期限(日と時間)を設定(ドロップダウンから「カスタム」を選択)
  5. キーに一意の名前を割り当てる
  6. 生成」をクリック

APIキーを作成したら、コピーして安全な場所に保管してください(パスワードマネージャーの使用を推奨)。APIキーは複数作成することができ、「APIキー」画面に一覧で表示されます。APIキーを取り消す場合には、名前と有効期限の横にある「取り消す」をクリックしてください。

Kinsta APIでサーバーログを取得する方法

Kinsta APIでログにアクセスするには、サイトの環境ID、取得したいログの種類(erroraccess、またはkinsta-cache-perf)、および取得するログの行数を指定します。

このエンドポイントを探索し、後でSlackbotに統合して、SlackスラッシュコマンドでKinsta APIとやり取りできるようにします。

サイトの環境IDは、IDを含むサイトの環境に関する情報を返すget site environmentエンドポイントを通して取得することができます。

{
  "site": {
    "environments": [
      {
        "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "name": "first-site",
        "display_name": "First site",
        "is_blocked": false,
        "id_edge_cache": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "cdn_cache_id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
        "is_premium": false,
        "domains": [
          {
            "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
            "name": "example.com",
            "type": "live"
          }
        ],
        "primaryDomain": {
          "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
          "name": "example.com",
          "type": "live"
        },
        "ssh_connection": {
          "ssh_port": "808080",
          "ssh_ip": {
            "external_ip": "1xx.1xx.1xx.1xx"
          }
        },
        "container_info": {
          "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
          "php_engine_version": "php8.0"
        }
      }
    ]
  }
}

サイトの環境IDを取得したら、/sites/environments/{env_id}/logs?file_name=error&lines=100GETリクエストを送信します。

curl -i -X GET \
  'https://api.kinsta.com/v2/sites/environments/{env_id}/logs?file_name=access&lines=100' \
  -H 'Authorization: Bearer '

これによって、指定されたログの行数の文字列が返されます。

{
    "environment": {
        "container_info": {
            "logs": "mysite.kinsta.cloud ::1 [07/Dec/2023:00:02:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.017 0.018\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:17:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.139 0.139\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:32:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.016 0.016\nmysite.kinsta.cloud ::1 [07/Dec/2023:00:47:01 +0000] HEAD \"/wp-cron.php?server_triggered_cronjob\" HTTP/2.0 200 \"-\" \"curl/7.68.0\" - \"/wp-cron.php\" - - 230 0.015 0.015\n"
        }
    }
}

各行をn改行で区切るよう出力をフォーマットすることができます。例えば、JavaScriptであればsplit()を使用します。

const logsData = {
    "environment": {
        "container_info": {
            "logs": "string"
        }
    }
};

const logsString = logsData.environment.container_info.logs;

// Splitting the logs string into an array of log entries based on the newline character '\n'
const logEntries = logsString.split('\n');

console.log(logEntries);

Kinsta APIでサーバーログ取得用のSlackスラッシュコマンドを実装する方法

サイト管理用にNode.jsとKinsta APIを使ってSlackbotを作成する方法はこちらでご紹介しており、Slackbotを作成して、KinstaのアプリケーションホスティングでホストされたNode.jsアプリを介して、Kinsta APIとやり取りする方法についてご説明しています。

今回は、サイトのログのエンドポイントを取得するために、別のSlackスラッシュコマンドを作成します。まずは、(まだの場合は)上記記事に目を通し、Node.jsアプリケーションとパーソナライズしたSlackbotの設定方法を理解しておきましょう。

その後、スタータープロジェクトをGitで複製します。

  1. コードを保存する任意のディレクトリに移動し、ターミナルで次のコマンドを実行します。
    git clone -b tutorial-1 --single-branch https://github.com/olawanlejoel/SlackBot-KinstaAPI.git
  2. プロジェクトフォルダに移動し、必要な依存関係をすべてインストールします。
    cd SlackBot-KinstaAPI
    npm install

サーバーログ取得用のSlackスラッシュコマンドを作成する

Kinsta APIを使ったSlackbotの構築方法では、以下5つのスラッシュコマンドを作成しました。

  • /site_id [site name]─サイトIDの取得
  • /environment_id [site name]─環境IDの取得
  • /clear_site_cache [environment id]─サイトキャッシュのクリア
  • /restart_php_engine [environment id]─PHPエンジンの再起動
  • /operation_status [operation id]─操作状況の確認

これとは別に新たなコマンドを作成していきます。サーバーログ取得用のSlackスラッシュコマンドを作成する手順は、以下のとおりです。

  1. Slackアプリケーションを開き、左サイドバーの「Slash Commands」を開く
  2. Create New Command」をクリック
  3. 以下の情報を入力
    • Command/get_site_logs
    • Short Description:error.log、kinsta-cache-perf.log、access.logなどのサイトのログファイルを取得
    • Usage Hint[Environment ID] [File name] [Lines, e.g., 1000]

[Environment ID][File name][Lines]などのパラメータとともにこのコマンドを使用することで、特定のログファイルを要求でき、必要な情報を確実に取得できます。さらに、ログファイル名と行数を入力しない場合を想定し、デフォルト値を持つようにコマンドを設定し、よりスムーズな操作を保証しています。

サーバーログ操作用のNode.js Fetchリクエストを実装する

スラッシュコマンドを作成したら、コマンドに応答するようにNode.jsアプリを変更します。まずは、エンドポイントと対話する非同期関数を作成しましょう。

app.jsファイルで、Slackから3つのパラメータを受け取るgetSiteLogs()関数を定義します。

async function getSiteLogs(environmentId, fileName, lines) {
    const query = new URLSearchParams({
        file_name: fileName || 'error',
        lines: lines || 1000,
    }).toString();
    const resp = await fetch(
        `https://api.kinsta.com/v2/sites/environments/${environmentId}/logs?${query}`,
        {
            method: 'GET',
            headers: getHeaders,
        }
    );
    const data = await resp.json();
    return data;
}

この関数は、JavaScriptのFetch APIを使ってKinsta APIと通信します。パラメータは予想される入力で、Slackコマンドから受け取り、実行のため特定の関数に渡されます。

また、ファイル名とログ行がSlack経由で追加されないことを仮定し、クエリパラメータがいくつかのデフォルト値を持っています。

getSiteLogs()関数を配置したら、次にSlackコマンドを設定していきます。これにはSlackから入力値を受け取り、関数を起動して、特定の応答をSlackに送り返す操作も含まれます。

サーバーログ取得用のNode.jsによるスラッシュコマンドを設定

スラッシュコマンドを設定するには、JavaScriptのイベントリスナーに似た機能を持つapp.command()関数を使用します。リッスンしたいコマンドを指定し、非同期コールバック関数を作成して、必要なアクションを定義していきます。この関数は以下3つのパラメータを受け取ります。

  • command─送信したスラッシュコマンドの情報
  • ack─スラッシュコマンドの受信を確認
  • say─Slackチャンネルにメッセージを送り返す

以下は、/get_site_logsコマンドの設定です。

app.command('/get_site_logs', async ({ command, ack, say }) => {
    await ack();

    const [environmentId, fileName, lines] = command.text.split(' ');
    let response = await getSiteLogs(environmentId, fileName, lines);

    if (response) {
        const logs = response.environment.container_info.logs.split('\n');
        const formattedLogs = logs.join('\n\n'); // またはその他の必要なフォーマット
        say(`Hey 👋, \n\nHere are the logs for ${fileName}:\n\n${formattedLogs}`);
    } else {
        say(`Sorry, no logs found for ${fileName}.`);
    }
});

上のコードは、getSiteLogs()関数を使ってパラメータに基づいてログを取得します。ログの取得に成功すると、say()関数でログをフォーマットし、指定されたファイルのログを表示するSlackメッセージを送信します。ログが見つからない場合は、その旨を伝える通知が表示されます。

最後にNode.jsサーバーコードをKinstaにデプロイし、Slackbotを起動します。

SlackスラッシュコマンドとKinsta APIを使用したサーバーログエンドポイントとの対話例

本プロジェクトのコードの全貌はこちらでご覧いただけます。

まとめ

Kinsta APIのログのエンドポイントを効率的に活用する方法をご紹介しました。このエンドポイントを使用すると、サイトのサーバーログをシームレスに取得し、迅速にトラブルシューティングを行うことができます。

これ以外にも、Kinsta APIには様々な機能があります。他のエンドポイントも試してみたり、プロジェクトで活用する画期的な方法を考案したりしてみてください。

Kinsta APIをどのように活用されていますか?導入してほしい、またはアクセスできるようにしてほしい特定の機能がありましたら、以下のコメント欄よりお知らせください。

Joel Olawanle Kinsta

Kinstaでテクニカルエディターとして働くフロントエンド開発者。オープンソースをこよなく愛する講師でもあり、JavaScriptとそのフレームワークを中心に200件以上の技術記事を執筆している。