# ログ

ログは、EMQXのデプロイメントにおける問題解決やパフォーマンス最適化に不可欠なリソースです。EMQXのデプロイメントログは、アクセス、操作、およびネットワークイベントに関する情報を記録します。EMQXプラットフォームコンソールを通じて、ログをリアルタイムで閲覧したり、オフライン解析のためにダウンロードしたりできます。

## デプロイメントログの表示

デプロイメントログにアクセスするには、EMQXプラットフォームコンソールで対象のデプロイメントに移動し、メニューから**Logs**を選択して**Logs**ページを開きます。

![view_log](./_assets/logs.png)

### 時間でのフィルタリング

デフォルトでは、Logsページには過去3日間のログが表示されます。以下の定義済み時間範囲でログをフィルタリングできます。

- 過去1時間
- 過去12時間
- 過去1日

また、カレンダーピッカーを使ってカスタム時間範囲を選択できます。ただし、

- 最大で3日間の範囲を一度に選択可能です。
- 過去14日間までのログを閲覧できます。

### ログレベルでのフィルタリング

デプロイメントログは、以下の5つの重大度レベルに分類されています。

- Warning（警告）
- Error（エラー）
- Critical（重大）
- Alert（アラート）
- Emergency（緊急）

ドロップダウンボックスから重大度レベルを選択し、「検索」ボタンをクリックすることでログをフィルタリングできます。

### エラータイプでのフィルタリング

特定のエラーカテゴリでログをフィルタリングできます。

- **データ統合**：MySQLのオフライン、認可失敗、スキーマ問題などのデータ統合関連エラー。
- **クライアント**：認証情報の誤り、アクセス制御情報の誤り、接続不能のその他理由などクライアント関連エラー。
- **メッセージ**：エンコード問題、メッセージの損失や破棄などメッセージ関連エラー。
- **認証**：対応するバックエンドサービスへの接続不能による拡張認証エラーなど認証エラー。
- **認可**：認可ルール適用の失敗など認可エラー。

### クライアントID、クライアントIPなどでのフィルタリング

以下のフィールドでログをフィルタリングできます。

- クライアントID
- クライアントIP

さらに詳細なフィルタリングオプションは、**More Filters**ドロップダウンを開くと利用可能で、以下を含みます。

- ユーザー名
- トピック
- コネクター名
- アクション名
- ルールID

### リセットおよびログのダウンロード

- **Reset**をクリックすると、ログ表示をデフォルトに戻します。
- **Download**をクリックすると、検索結果から最大1,000件のログレコードをエクスポートできます。

## よくあるログ解析

このセクションでは、EMQXでよく見られる`warning`および`error`ログの例、問題の原因、推奨される対処方法をまとめ、運用やトラブルシューティングの支援を行います。

### クライアント接続および認可ログ

#### [Warning] クライアント認証失敗

**ログ例：**

```
clientid: xx, peername: xxx:xx, username: 1, pid: <0.99601.0>, reason: not_authorized, tag: AUTHN, msg: authentication_failure
```

このログは、対応するMQTTユーザー名の認証データが見つからなかったことを示します。

```
clientid: xx, peername: xxx:xx, username: test, pid: <0.15269.0>, reason: bad_username_or_password, tag: AUTHN, msg: authentication_failure
```

このログは、MQTTユーザー名は見つかったがパスワード検証に失敗したことを示します。

**対処方法：**
クライアントに設定されているユーザー名とパスワードが正しいか確認してください。

#### [Warning] クライアントACL認可失敗

**ログ例：**

```
clientid: xx, peername: xxx:xx, username: test, topic: test, pid: <0.34387.0>, action: SUBSCRIBE(Q0), source: built_in_database, tag: AUTHZ, msg: authorization_permission_denied
```

**問題点：**
クライアントは認証に成功しましたが、許可されていないトピックへのサブスクライブやパブリッシュを試みたため、認可拒否が発生しました。

**対処方法：**

- アクセス制御（ACL）設定が正しいか確認してください。
- 現在のユーザーが指定トピックへのアクセス権限を持っているか確認してください。

#### [Warning] 非標準MQTTプロトコル接続失敗

**ログ例：**

```
[MQTT] Parse failed for function_clause[{emqx_frame,parse_packet,[{mqtt_packet_header,4,false,3,true}
```

**問題点：**
クライアントが接続時に非標準のMQTTプロトコルや不正なパケット形式を使用しています。

**対処方法：**
クライアントが標準のMQTTプロトコルバージョン（例：3.1.1または5.0）を使用していることを確認してください。

### メッセージ配信およびフロー制御ログ

#### [Warning] メッセージ破棄（キュー満杯）

**ログ例：**

```
clientid: xx, peername: xxx:xx, username: test, topic: test, pid: <0.198894.0>, payload: xxxxxxxxxx, payload_encode: hex, queue: {"store_qos0":true,"max_len":1000,"len":1000,"dropped":56942}, msg: dropped_msg_due_to_mqueue_is_full
```

**問題点：**
クライアントがオフラインまたはメッセージ消費が遅いため、サーバー側のキューが満杯となりメッセージが破棄されました。

**対処方法：**

1. クライアントが頻繁にオフラインになる場合：
   - `clean session = true`を設定してください。
   - 切断後のセッション損失を避けるため、自動再接続を有効にしてください。
2. クライアントのメッセージ消費が遅い場合：
   - クライアントSDKを最適化し消費速度を向上させてください。
   - メッセージ負荷を分散するために共有サブスクリプションを利用してください。

#### [Warning] TPS制限超過

**ログ例：**

```
clientid: xx, peername: xxx:xx, username: test, topic: test, pid: <0.194662.0>, reason: {failed_to_consume_from_limiter,{{listener,'tcp:default'},messages}}, tag: QUOTA, msg: cannot_publish_to_topic_due_to_quota_exceeded
```

**問題点：**
クライアントのパブリッシュレートがデプロイメントで設定されたTPS（Transactions Per Second）制限を超過しました。

**対処方法：**

- クライアントのメッセージパブリッシュレートを制限内に抑えてください。
- または、ビジネス要件に応じてデプロイメントのTPSクォータを調整してください。

### デプロイメントのデータ統合ログ

#### [Error] MySQLコネクター起動失敗

**ログ例：**

```
[warning] tag: CONNECTOR/MYSQL, msg: start_resource_failed, reason: {start_pool_failed,<<"connector:mysql:test">>,{shutdown,#{cause => ehostunreach,port => 3306,user => <<"root">>,host => "xxx",database => <<"mqtt">>}}}, resource_id: <<"connector:mysql:test">>
```

**問題点：**
MySQLデータコネクターの初期化に失敗しました。データベースサービスが到達不能、または接続設定が誤っている可能性があります。

**対処方法：**

- MySQLサーバーの状態およびネットワーク接続を確認してください。
- コネクターの設定（ホスト、ポート、ユーザー名、データベース名など）を検証してください。

#### [Error] HTTPコネクター起動失敗

**ログ例：**

```
pid: <0.28885448.0>, line: 810, reason: timeout, resource_id: connector:http:c-xxX, tag: CONNECTOR/WEBHOOK, msg: start_resource_failed
```

**問題点：**
WebhookまたはHTTPコネクターの起動に失敗しました。通常はHTTPサービスへの接続タイムアウトが原因です。

**対処方法：**

- 対象のHTTPサービスがアクセス可能であることを確認してください。
- HTTPコネクター設定のURL、ポート、認証設定が正しいか確認してください。

#### [Error] RocketMQコネクター起動失敗

**ログ例：**

```
[error] crasher: initial call: rocketmq_client:init/1, pid: <0.5161.0>, exit: {fail_to_connect_rocketmq_server,...}
[warning] tag: CONNECTOR/ROCKETMQ, msg: start_resource_failed, reason: {fail_to_connect_rocketmq_server,...}, resource_id: <<"connector:rocketmq:test">>
```

**問題点：**
RocketMQクライアントが対象サーバーに接続できず、コネクターの初期化に失敗しました。

**対処方法：**

- RocketMQサービスが正常に稼働しているか確認してください。
- コネクター設定（アドレス、ポート、認証情報など）を検証してください。

#### [Error] Kafkaリソース例外

**ログ例：**

```
topic: xxx, pid: <0.25097.0>, group: ..., reason: failed_to_fetch_metadata, msg: failed_to_refresh_partition_count_will_retry
topic: xxx, pid: <0.25048.0>, errors: [{"reason":"connection_timed_out","host":"xxx:xx"}], msg: failed_to_fetch_metadata
```

**問題点：**
Kafkaコネクターがトピックのメタデータ取得に失敗しました。接続タイムアウトやKafkaクラスター設定の誤りが考えられます。

**対処方法：**

- Kafkaサービスの稼働状況と接続性を確認してください。
- アクションで設定されたKafkaトピックがKafkaクラスター内に既に作成されていることを確認してください。

#### [Error] MQTTリソース例外

**ログ例：**

```
pid: <0.5959.0>, line: 59, reason: timeout, resource_id: connector:mqtt:c-xxx, tag: RESOURCE, msg: start_ecpool_error
pid: <0.5959.0>, line: 895, reason: timeout, resource_id: connector:mqtt:c-xxx, tag: CONNECTOR/MQTT, msg: start_resource_failed
```

**問題点：**
MQTTコネクターの初期化がタイムアウトしました。対象MQTTブローカーが到達不能、または設定ミスの可能性があります。

**推奨事項：**

- 対象MQTTブローカーの状態およびネットワーク接続を確認してください。
- MQTTコネクターの設定（ホスト、ポート、認証情報など）が正しいか検証してください。
