📶

IISのログからAPIアクセス数のグラフを作る

2024/03/29に公開

はじめに

IISのログからAPIアクセス数のグラフを作るやり方を記載します。

  • 最適な手法ではありませんが、10分以内でできる方法です。こだわれば自動化できると思いますが、私にとってはめったに行わない作業だったので見れれば良いというレベルで止めました。
  • SaaS(例えばNewRelic)でAPMが入っていればこの作業は不要です。が、未導入のシステムからAPIアクセス数を取得したかったというのが、今回のモチベーションとなります。

手順

PostgerSQLのDBを1つ用意します。作り方は何でもよいですが、Dockerで用意する手順は以下

編集用のDBの準備

docker-compose.yaml
services:
  postgres:
    image: postgres:16.1
    container_name: postgres_test
    environment:
      POSTGRES_PASSWORD: password
    healthcheck:
      test: pg_isready -U postgres
      interval: 3s
      timeout: 2s
      retries: 3
    ports:
      - 5432:5432
    volumes:
      - db-test:/var/lib/postgresql/data
      - ./docker/db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro
volumes:
  db-test:

dockerが起動したときにDBを自動で作るようにしておきます。

./docker/db/docker-entrypoint-initdb.d/00_create_test_database.sql
CREATE DATABASE test;
GRANT ALL PRIVILEGES ON DATABASE test TO postgres;

docker-composeを起動しましょう。

docker-compose up -d

IISログ用のtableを作ります。項目はIISログの項目そのままとなります。

CREATE TABLE iislogimport (
    id SERIAL PRIMARY KEY,
    "date-time" TIMESTAMP,
    "s-ip" TEXT,
    "cs-method" TEXT,
    "cs-uri-stem" TEXT,
    "cs-uri-query" TEXT,
    "s-port" TEXT,
    "cs-username" TEXT,
    "c-ip" TEXT,
    "cs(User-Agent)" TEXT,
    "cs(Referer)" TEXT,
    "sc-status" TEXT,
    "sc-substatus" TEXT,
    "sc-win32-status" TEXT,
    "time-taken" TEXT
);

IISログを取得

IISが導入されているサーバーの%SystemDrive%\inetpub\logs\LogFilesから分析したい日付のファイルを取得しましょう。

ファイルをローカルで編集します。これは、スクリプトで自動化してもよいですが、手動で行う手順です。

  1. ファイルの拡張子を.csvに変更
  2. 半角スペースを,に変更
  3. dateとtimeが,で分かれてしまうため、ここだけ半角スペースに戻す
  4. #が先頭についている行はCSV形式として不要なので除去

編集が完成したら、CSVをDBへインポートします。数万件であればDBツール備え付けのインポート機能で十分です。それ以上のサイズであればloader系のコマンドを検討しましょう。

ログの検索

特定のエンドポイントからのアクセスに限定しているクエリですが、参考にしてください。分単位でのアクセス数が取得できます。

  • UTCで取得されていることに注意してください。必要であればJSTに直すために+9:00してください。
select TO_CHAR("date-time", 'YYYY-MM-DD HH24:MI') AS minute,
       COUNT(*) AS count
from iislogimport 
where  "cs-uri-stem" = '/test/testtest/xxx'
GROUP BY TO_CHAR("date-time", 'YYYY-MM-DD HH24:MI')
ORDER BY minute;

SQLで扱っている(IISで扱っている)項目の定義は以下です。アクセス元がユーザーエージェントを入力していれば送信者で絞り込めたりなどたくさんの工夫が可能です。
https://learn.microsoft.com/ja-jp/iis/manage/provisioning-and-managing-iis/configure-logging-in-iis#select-w3c-fields-to-log

グラフ化

スプレッドシートに貼り付けし、グラフ作成し完成です。

後しまつ

作業が終わったらdocker-composeを終了しましょう。お疲れ様でした。

docker-compose down

Discussion