# ログファイル

**サポート問い合わせの場合は log/ ディレクトリ以下をすべて圧縮して送ってください**

## log/ 以下のログファイル

Sora は log/ ディレクトリ以下にログファイルを出力します。

### Sora の運用に関係するログ

- sora.log または sora.jsonl- Sora の開始、終了や問題があった場合に出力されますので、まずはこの監視をお願いします
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- auth_webhook.log または auth_webhook.jsonl- auth_webhook で外部に送信する処理を全て書き込みます
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- session_webhook.log または session_webhook.jsonl- session_webhook で外部に送信する処理を全て書き込みます
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- session_webhook_error.log または session_webhook_error.jsonl- session_webhook で外部への送信が失敗した処理を書き込みます
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- event_webhook.log または event_webhook.jsonl- event_webhook で外部に送信する処理を全て書き込みます
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- event_webhook_error.log または event_webhook_error.jsonl- event_webhook で外部に送信が失敗した処理を書き込みます
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します

### Sora のサポートに関係するログ

- connection.log または connection.jsonl- 接続が切断した際にクライアントとサーバーの統計情報を出力するログです
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- signaling.log または signaling.jsonl- シグナリングでやりとりされている offer/answer/candidate/re-offer/re-answer と接続終了を記録したログです
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- api.log または api.jsonl- 一部の API 操作に関するログを出力します
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- internal.log または internal.jsonl- Sora が予定外の動作をしたときに出力されるログです。問題解決に必須のログです
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- crash.log- Sora が予定外の動作をしたときに出力されるログです。問題解決に必須のログです
  - ログローテーションされませんので、ログローテーションをお願いします
  - 週次ログローテーションを推奨します
- erlang.log.<1-5>- サポート時に必要となるログですので、気にする必要はありません
  - 自動でログローテーションされますので、ログローテーションは不要です
  - `bin/sora foreground` コマンドで起動する場合には出力されません
- sysctl.log- 起動時に取得するログで、毎回上書きされます
  - sysctl -a の実行結果を記録します
  - ログローテーションは不要です
- ulimit.log- 起動時に取得するログで、毎回上書きされます
  - ulimit -n の実行結果を記録します
  - ログローテーションは不要です
- run_erl.log- 起動時に出力されるログのため、ほとんどログが出力されることはありません
  - ログローテーションは不要です
  - `bin/sora foreground` コマンドで起動する場合には出力されません
- connection_created_wait_timeout_error/<timestamp>_<connection_id>.jsonl- sora.log に `CONNECTION-CREATED-WAIT-TIMEOUT-ERROR` が出力された際の接続情報を出力します
  - クライアントと Sora との間で WebRTC が確立できなかった場合の情報です
  - ファイル名は時刻とコネクション ID の組み合わせです

## 特別なログ

Sora が異常終了した際 `erl_crash.dump` というファイルが log/ ディレクトリに生成されます。

こちらは **必ず** 保存し、送っていただけるようお願いいたします。

### 監視用確認目的で erl_crash.dump ログを強制的に出力させる方法

監視を行う際に実際に `erl_crash.dump` を生成したい場合には、 `bin/sora daemon` で起動した上で、
`kill -SIGUSR1` を使用して `run_erl` プロセスを落としてください。


```
$ kill -SIGUSR1 <プロセス ID>
```

この方法で log/ ディレクトリに `erl_crash.dump` が生成されます。

## JSONL (JSON Lines) フォーマット

Sora は一部のログを除いて JSONL フォーマットでログを出力します。

JSONL の仕様は [JSON Lines](https://jsonlines.org/) に記載されているものに準拠します。

- UTF-8 エンコード
- 改行は `\n`
- 各行は JSON 値
- ファイル拡張子は `jsonl`

### JSONL フォーマットで出力されるログ

`sora.conf` の `legacy_log_format` を `false` に設定することで以下のログが JSONL フォーマットで出力されます。

JSONL フォーマット出力ログの拡張子を `jsonl` に変更するには `sora.conf` の `legacy_log_extension` を `false` に設定します。

- sora ログ
- internal ログ
- api ログ
- signaling ログ
- connection ログ
- auth_webhook ログ
- session_webhook ログ
- session_webhook_error ログ
- event_webhook ログ
- event_webhook_error ログ


## connection ログ

**出力ファイル名**: connection.log または connection.jsonl

Sora は接続単位で統計情報を保持しています。クライアント側の統計情報とサーバー側の統計情報の両方をログとして出力します。

クライアント側の統計情報はユーザーエージェント統計情報機能を利用しているため、
SDK 側がユーザーエージェント統計機能に対応している必要があります。

こちらのログはログローテーションしないため、ローテーションが必要となります。

## sora ログ

**出力ファイル名**: sora.log または sora.jsonl

sora ログは主にサポートで利用するためのログを出力します。そのためエラーメッセージがかなり技術的な表現になっています。

- sora ログは何かあって大量のログが出たとしてもうまい具合にスキップする機能が入っています

### UTC に固定

sora ログのタイムスタンプは RFC 3339 UTC (マイクロ秒) 形式に固定されています。


```
2022-06-06T08:04:37.390710Z [warning] [sora/1DSH1E4S/sendrecv] [sim,multi]
```

JSONL フォーマットの場合は `timestamp` という項目でタイムスタンプが出力されます。

```javascript
{
  "level": "debug",
  "channel_id": "sora",
  "multistream": true,
  "role": "sendonly",
  "simulcast": false,
  "spotlight": false,
  "node_name": "sora@127.0.0.1",
  "connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
  "timestamp": "2022-08-02T04:43:02.828358Z"
}
```

### クラスター利用時

#### レガシーフォーマット利用時

レガシーフォーマット利用時にクラスターを有効にしている場合はログレベルの後ろにノード名が出力されます。


```
2022-06-07T02:25:48.479789Z [warning] sora@127.0.0.1 [sora/1DSH1E4S/sendrecv] [sim,multi]
```

#### JSONL フォーマット利用時

JSONL フォーマットの場合はノード名は常に出力されます。

```javascript
{
  "level": "debug",
  "channel_id": "sora",
  "multistream": true,
  "role": "sendonly",
  "simulcast": false,
  "spotlight": false,
  "node_name": "sora@127.0.0.1",
  "connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
  "timestamp": "2022-08-02T04:43:02.828358Z"
}
```

### オプション情報

#### レガシーフォーマット利用時

- [チャネル ID/コネクション ID(ショート)/role] を表示します
- `multi` / `spot` / `sim` の３つを表示します

**multi**
: マルチストリーム

**spot**
: スポットライト

**sim**
: サイマルキャスト


```
2022-06-07T02:25:48.479789Z [warning] [sora/1DSH1E4S/sendrecv] [sim,multi]
```

#### JSONL フォーマット利用時

JSONL フォーマットの場合は各項目はブーリアンで出力されます。

```javascript
{
  "level": "debug",
  "channel_id": "sora",
  "multistream": true,
  "role": "sendonly",
  "simulcast": false,
  "spotlight": false,
  "node_name": "sora@127.0.0.1",
  "connection_id": "NXHKH46FP93571ZM4PZBSFD4Z4",
  "timestamp": "2022-08-02T04:43:02.828358Z"
}
```

### 出力例

#### レガシーフォーマット利用時

シグナリング接続時の `"type"` で指定する JSON が間違っており、Sora 側から切断した際に出力される `INVALID-JSON` の出力例は次のとおりです。


```
2022-06-07T02:25:48.479789Z [error] [-/-/-] <0.9239.2> INVALID-JSON
```

シグナリングに WebSocket を利用している場合に、 60 秒に一度も `"type": "pong"` が返ってこない場合Sora 側から切断した際に出力される `PONG-TIMEOUT-ERROR` の出力例は次の通りです。


```
2022-06-07T02:25:48.479789Z [error] [sora/4G7607CP/sendrecv] [multi] <0.13016.17> PONG-TIMEOUT-ERROR | reason=<<"WebSocket">>
```

#### JSONL フォーマット利用時

シグナリング接続時に認証サーバーがステータスコード 400 を返してきた際に出力される `AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE` の出力例は次の通りです。

```javascript
{
  "channel_id": "sora",
  "connection_id": "J9RQEB074S2EB9SFBCN9AH7ASM",
  "domain": [
    "sora",
    "signaling"
  ],
  "level": "error",
  "msg": "AUTH-WEBHOOK-RESPONSE-UNEXPECTED-STATUS-CODE | reason={auth_webhook_response_unexpected_status_code,#{status_code => 400}}",
  "multistream": true,
  "node": "sora@127.0.0.1",
  "role": "recvonly",
  "simulcast": false,
  "sora_version": "2022.2.0",
  "spotlight": false,
  "timestamp": "2022-08-03T03:43:13.588364Z"
}
```

### warning

ログレベル `warning` は「接続自体は維持できる問題」の際に出力します。
このログが出力された場合でも Sora 側から切断は行いません。

- 一般- WEBSOCKET-TERMINATE- DataChannel シグナリングで ignore_disconnect_websocket: true の際に WebSocket が想定外の終了をした場合に出力します
  - MULTISTREAM-RE-ANSWER-NO-ICE-UFRAG- マルチストリーム利用時 `type: re-answer` を受信した際に ICE に必要な SDP が含まれていない場合に出力します
  - MULTISTREAM-INTERNAL-ERROR
- ウェブフック- INVALID-AUTHZ-VALUE- 認証ウェブフック成功時に認証サーバーからの払い出した値がおかしい場合に出力します
  - TERMINATE-EVENT-WORKER- イベントウェブフックのワーカーが何らかの理由で終了した場合に出力します
  - MISSING-WEBHOOK-BASIC-AUTH-USER-ID- ウェブフック利用時にベーシック認証のユーザー ID が見つからない場合に出力します
  - MISSING-WEBHOOK-BASIC-AUTH-PASSWORD- ウェブフック利用時にベーシック認証のパスワードが見つからない場合に出力します
  - MISSING-WEBHOOK-PROXY-AUTH-PASSWORD- ウェブフック利用時にプロキシのパスワードが見つからない場合に出力します
- 録画- ARCHIVE-FINAL-SPLIT-ERROR- 録画ファイルの分割がエラーになった場合に出力します、ただし全体出力に向けて処理は継続します
  - MISSING-RECORDING-WORKER-PID- 録画処理が完了したワーカーが見つからず正常終了できない場合に出力します
- プロトコル- DTLS-ALERT- DTLS でレベルが WARNING のアラートメッセージがクライアントから送られてきた場合に出力します
  - TURN-SEND-INDICATION-BINDING-ERROR- TURN 利用時に STUN-Binding-Error over STUN-Send-Indication を受信した場合に出力します
  - TURN-CHANNEL-DATA-BINDING-ERROR- TURN 利用時に STUN-Binding-Error over TURN-Channel-Data を受信した場合に出力します
  - SIMULCAST-DUPLICATED-RID- クライアントから複数の SSRC から同一の RID が送られてきた場合に出力します
  - UNKNOWN-RTP- `role: reconly` にもかかわらず RTP パケットが送られてきた場合に出力します
    - Sora の内部エラーでも出力される場合があります
  - UNKNWON-RTCP- 見知らぬ RTCP を受信した場合に出力します
  - ULPFEC-RECOVER-ERROR- ULPFEC を利用している場合にリカバーを試みて失敗した場合に出力します
  - RTP-PACKET-LOSS-SIMULATOR-INCOMING-ENABLED- 受信パケロスシュミレーターを有効にしている場合に出力します
  - RTP-PACKET-LOSS-SIMULATOR-OUTGOING-ENABLED- 送信パケロスシュミレーターを有効にしている場合に出力します

### error

ログレベル `error` は「接続自体を維持できない問題」の際に出力します。
このログが出力された場合、Sora 側から切断を行います。

- 一般- UNEXPECTED-EXIT
- シグナリング- INVALID-JSON- 無効な JSON を受け取った場合に出力します
  - FAILURE-JSON-DECODE- JSON のデコードに失敗した場合に出力します
  - AUTHENTICATION-FAILURE- 認証ウェブフックで認証が失敗した場合に出力します
  - AUTHENTICATION-INTERNAL-ERROR- 認証ウェブフックで 200 番台以外が返ってきた場合に出力します
  - INTERNAL-ERROR- Sora の内部エラーです
  - MISSING-SDP-FINGERPRINT- SDP に DTLS の証明書検証に利用するフィンガープリントが見つからなかった場合に出力します
  - MISSING-ICE-SDP- SDP に ICE で利用する情報が見つからなかった場合に出力します
  - FAILURE-SDP-PARSE- SDP のパースに失敗した場合に出力します
  - INVALID-SIGNALING-TYPE- 送られてきたシグナリングメッセージの type が無効な場合に出力します
  - UNEXPECTED-SIGNALING-TYPE- 送られてきたシグナリングメッセージの type が見知らぬ場合に出力します
  - MISSING-TYPE- 送られてきたシグナリングメッセージに type が見つからない場合に出力します
  - INVALID-MESSAGE- E2EE が有効ではないのに E2EE メッセージが送られてきた場合に出力します
  - TOO-LARGE-JSON- 送られてきた JSON が巨大な場合に出力されます
  - TOO-MANY-CANDIDATE- あまりにも多い type: candidate を送ってきた場合に出力します
  - SIGNALING-INTERNAL-ERROR- シグナリングでの内部エラーが発生した場合に出力します
  - TRANSPORT-INTERNAL-ERROR- 通信での内部エラーが発生した場合に出力します
  - BAD-FINGERPRINT- DTLS の証明書の検証に失敗した場合に出力します
  - PONG-TIMEOUT-ERROR- 5 秒間隔で type: ping を送信し、60 秒間 1 度も type: pong が返ってこない場合に出力します
  - CONNECT-WAIT-TIMEOUT-ERROR- WebSocket を確立して一定時間以内に type: connect を送ってこない場合に出力します
  - CONNECTION-CREATED-WAIT-TIMEOUT-ERROR- 一定時間以内に WebRTC が確立しない場合に出力します
  - ANSWER-TIMEOUT-ERROR- 一定時間以内に type: answer を送ってこない場合に出力します
- ライセンス- EXPIRED-LICENSE- ライセンスが切れている場合に出力されます
  - EXCEED-MAX-CONNECTIONS- ライセンスの同時接続数を超えて接続をしようとしたクライアントがいた場合に出力されます
- 認証ウェブフック- AUTH-WEBHOOK-INTERNAL-ERROR- 認証ウェブフックで内部エラーが発生した場合出力します
  - AUTH-WEBHOOK-AUTHZ-INTERNAL-ERROR- 認証ウェブフックの戻り値で内部エラーが発生した場合出力します
- イベントウェブフック- EVENT-WEBHOOK-ERROR- イベントウェブフックリクエストが正常に送信できなかった場合に出力します
- DataChannel- INVALID-DATA-CHANNEL-USER-DATA- 片方向でしか利用していない DataChannel にメッセージが送られてきた場合に出力します
- 録画- ARCHIVE-FAILED- 録画ファイルの生成に失敗した際に出力します
  - RECORDING-INTERNAL-ERROR- 録画で内部エラーが発生した際に出力します
- E2EE- INVALID-E2EE-MESSAGE- E2EE メッセージがおかしい場合に出力します
  - NOT-ALLOWED-E2EE- E2EE を許可していない状態で E2EE 機能をクライアントが利用しようとした場合に出力します
- プロトコル- TURN-UDP-INTERNAL-ERROR- TURN UDP で内部エラーが発生した場合に出力します
  - DTLS-ALERT- DTLS でレベルが FATAL のアラートメッセージが送られてきたとき出力します

### emergency

ログレベル `emergency` は「Sora の起動を維持できない問題」の際に出力します。
このログが出力された場合、Sora を終了します。

- BOOT-FAILED> - Sora が正常に起動できない場合に出力します
- 設定- SORA-CONF-ERROR- sora.conf が正常に読み込めない場合に出力します
- クラスター- CLUSTER-INTERNAL-FAILURE- クラスター内部で問題が発生した際に出力します
