メインコンテンツまでスキップ

使用状況ログ

警告

この機能は実験的であり、将来のリリースで変更される可能性があります。

備考

使用状況ログは v.26.1.5 以降で利用可能です。

Asprova My Schedule / WS サーバは、ログイン、ログアウト、データアクセスなどのイベントの使用状況ログを記録できます。

使用状況ログの有効化

警告

使用状況ログを有効にすると、サーバのパフォーマンスに悪影響を及ぼす可能性があります。

使用状況ログはデフォルトで無効です。有効にするには、サーバの config.json で以下を設定してください:

{
"enable_usage_log": true
}

設定

設定項目デフォルト値説明
enable_usage_logfalse使用状況ログの有効・無効を切り替えます。
usage_log_retention"30d"使用状況ログファイルが自動削除されるまでの保持期間です。

ログファイル

使用状況ログファイルは、サーバのデータディレクトリ (user_file_directory) 内の logs ディレクトリに書き込まれます。 デフォルトでは、以下のパスになります:

C:\ProgramData\Asprova\Asprova My Schedule\WS\logs

毎日 usage-YYYY-MM-DD.log という名前のファイルが生成されます。ファイルは自動的にローテーションされ、保持期間の設定に基づいて古いファイルは削除されます。

ログファイルの各行は、以下を含む JSON オブジェクトです:

  • eventType — イベントの種類(下記参照)。
  • user — イベントを発生させたユーザ(該当する場合)。
    • userId — ユーザの ID。
    • username — ユーザの名前。
  • req — イベントを発生させた HTTP リクエストの情報(該当する場合)。
    • method — HTTP メソッド(例: POST)。
    • path — リクエストパス(例: /api/auth/login)。
    • ip — クライアントの IP アドレス。
  • details — イベント固有の追加情報。
  • timestamp — イベントの発生日時。

イベント

以下のイベントが記録されます:

イベント説明
ws:server:startサーバが起動しました。
ws:user:createdユーザが作成されました。
ws:user:login:successユーザのログインが成功しました。
ws:user:login:failureログイン試行が失敗しました。
ws:user:logoutユーザがログアウトしました。
ws:user:removedユーザが削除されました。
my-schedule:license:ccu:added新しい同時接続ユーザが受け入れられました。
my-schedule:license:ccu:max-reached同時接続ユーザ数の上限に達したため、接続が拒否されました。
my-schedule:license:ccu:released-with-logoutユーザのログアウトにより同時接続が解放されました。
my-schedule:license:ccu:expiredユーザの同時接続予約が期限切れにより解放されました。
my-schedule:license:maintenance-mode:enteredサーバがメンテナンスモードに入りました。
my-schedule:license:maintenance-mode:leftサーバがメンテナンスモードから復帰しました。
my-schedule:view:accessedユーザがビューにアクセスしました。
my-schedule:view:uploadedビューにデータがアップロードされました。

ws:server:start

サーバが起動しました。

詳細フィールド説明
portサーバがリッスンしているポート番号。
httpsHTTPS が有効かどうか。

ws:user:created

ユーザが作成されました。

詳細フィールド説明
id新しいユーザの ID。
username新しいユーザの名前。
type新しいユーザのログイン方法。
roles新しいユーザのロール。

ws:user:login:success

ユーザのログインが成功しました。追加の詳細フィールドはありません。

ws:user:login:failure

ユーザのログイン試行が失敗しました。このイベントでは user フィールドは利用できません。

詳細フィールド説明
usernameログイン試行に使用されたユーザ名。
reasonログイン試行が失敗した理由。

ws:user:removed

ユーザが削除されました。user フィールドは削除を実行したユーザを示します。

詳細フィールド説明
id削除されたユーザの ID。
username削除されたユーザの名前。

ws:user:logout

ユーザがログアウトしました。追加の詳細フィールドはありません。

my-schedule:license:ccu:added

新しい同時接続ユーザが受け入れられました。

詳細フィールド説明
poolユーザが追加された CCU プール。
currentCount接続追加後の現在の同時接続ユーザ数。
maxCountこのプランで許可されている同時接続ユーザの最大数。

my-schedule:license:ccu:max-reached

同時接続ユーザ数の上限に達したため、接続が拒否されました。

詳細フィールド説明
pool上限に達した CCU プール。
currentCountこのプランの現在の同時接続ユーザ数。
maxCountこのプランで許可されている同時接続ユーザの最大数。

my-schedule:license:ccu:released-with-logout

ログアウトにより同時接続数が解放されました。プールごとに1つのイベントが発行されます。

詳細フィールド説明
poolユーザが削除された CCU プール。
currentCountこのプランの現在の同時接続ユーザ数。
maxCountこのプランで許可されている同時接続ユーザの最大数。

my-schedule:license:ccu:expired

非アクティブにより同時接続が期限切れとなり、解放されました。プールごとに1つのイベントが発行されます。

詳細フィールド説明
poolユーザが削除された CCU プール。
currentCountこのプランの現在の同時接続ユーザ数。
maxCountこのプランで許可されている同時接続ユーザの最大数。

my-schedule:license:maintenance-mode:entered

利用可能なライセンスが不足しているため、サーバがメンテナンスモードに入りました。追加の詳細フィールドはありません。

my-schedule:license:maintenance-mode:left

サーバがメンテナンスモードから復帰しました。追加の詳細フィールドはありません。

my-schedule:view:accessed

ユーザがビューにアクセスしました。このイベントは重複排除されます — 短い時間枠内でユーザ、プロジェクト、ビューごとに1つのエントリのみが記録されます。

詳細フィールド説明
projectIdプロジェクト ID。
viewNameビューの名前(例: ResGanttDispatchingView)。

my-schedule:view:uploaded

ビューにデータがアップロードされました。このイベントは重複排除されます — 短い時間枠内でユーザ、プロジェクト、ビューごとに1つのエントリのみが記録されます。

詳細フィールド説明
projectIdプロジェクト ID。
viewNameビューの名前(例: ResGanttDispatchingView)。

DuckDB によるログ分析

使用状況ログファイルは改行区切り JSON(NDJSON)形式であり、DuckDB でインポート不要で直接クエリできます。

セットアップ

ログディレクトリでターミナルを開き、DuckDB を起動します:

cd "C:\ProgramData\Asprova\Asprova My Schedule\WS\logs"
duckdb

ビューを作成すると、クエリごとにファイルパスを繰り返す必要がなくなります。glob パターンを使用してすべてのログファイルを含めます:

CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-*.log', filename=true);

1日分のみをクエリする場合:

CREATE VIEW usage_logs AS SELECT * FROM read_json_auto('usage-2026-04-10.log');

イベント種別ごとの件数

SELECT eventType, count(*) AS count
FROM usage_logs
GROUP BY eventType
ORDER BY count DESC;

ログイン失敗の一覧

SELECT timestamp, details.username, req.ip
FROM usage_logs
WHERE eventType = 'ws:user:login:failure'
ORDER BY timestamp;

ビューアクセスによるアクティブユーザ

SELECT "user".username, details.projectId, details.viewName, count(*) AS accesses
FROM usage_logs
WHERE eventType = 'my-schedule:view:accessed'
GROUP BY "user".username, details.projectId, details.viewName
ORDER BY accesses DESC;

CCU 使用状況の推移

SELECT timestamp, eventType, details.pool, details.currentCount, details.maxCount
FROM usage_logs
WHERE eventType LIKE 'my-schedule:license:ccu:%'
ORDER BY timestamp;