使用状況ログ
この機能は実験的であり、将来のリリースで変更される可能性があります。
使用状況ログは v.26.1.5 以降で利用可能です。
Asprova My Schedule / WS サーバは、ログイン、ログアウト、データアクセスなどのイベントの使用状況ログを記録できます。
使用状況ログの有効化
使用状況ログを有効にすると、サーバのパフォーマンスに悪影響を及ぼす可能性があります。
使用状況ログはデフォルトで無効です。有効にするには、サーバの config.json で以下を設定してください:
{
"enable_usage_log": true
}
設定
| 設定項目 | デフォルト値 | 説明 |
|---|---|---|
enable_usage_log | false | 使用状況ログの有効・無効を切り替えます。 |
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 | サーバがリッスンしているポート番号。 |
https | HTTPS が有効かどうか。 |
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 | ビューの名前(例: ResGantt、DispatchingView)。 |
my-schedule:view:uploaded
ビューにデータがアップロードされました。このイベントは重複排除されます — 短い時間枠内でユーザ、プロジェクト、ビューごとに1つのエントリのみが記録されます。
| 詳細フィールド | 説明 |
|---|---|
projectId | プロジェクト ID。 |
viewName | ビューの名前(例: ResGantt、DispatchingView)。 |
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;