Fine-Grained Logging

Fine-grained logging を使うと、特定のターゲットに対してログレベルを指定することができます。ターゲットはリソースタイプやリソース名によって指定します。現在は、モノのグループのみがターゲットとして指定可能です。つまり、Fine-grained logging を使うと、特定のモノのグループに対してログレベルを指定することができます。Fine-grained logging のログは AWSIoTLogsV2 というロググループに保存されます。

ここでは、どのようにモノのグループに対してログのレベルを設定するかを学びます。このログのレベルは、グローバルな設定でのログのレベルとは異なるレベルを設定できます。例えば、特定のモノのグループに対して、より詳細なレベルのログを取得したい場合などに活用できます。ここでは、先ほど作成したグループに対してログのレベルを設定し、フィルターを利用してログを検索します。

先ほど作成したグループを利用します。

THING_GROUP_NAME=building-$NAME

現在のロギングの設定を確認します。

aws iot get-v2-logging-options

このグループに対して、ログのレベルを DEBUG に設定します。

aws iot set-v2-logging-level --log-level DEBUG \
  --log-target "{\"targetType\": \"THING_GROUP\", \"targetName\": \"$THING_GROUP_NAME\"}"

# ログのレベルを確認します
aws iot list-v2-logging-levels

Thing Groups の手順の中でやったように、許可されているトピックや許可されていないトピックに対してメッセージを発行してみましょう。

CloudWatch にログが届くまで、1〜2分待ち、以下のコマンドでログを検索してみましょう。

# 過去1時間のログを検索するために、ログの開始時刻(ミリ秒)を環境変数に設定します
starttime=$(($(($(date '+%s') - 3600)) * 1000))

# 過去1時間の全てのログを検索します
aws logs filter-log-events --log-group-name AWSIotLogsV2 \
  --start-time $starttime

# 過去1時間のINFOレベルのログを検索します
aws logs filter-log-events --log-group-name AWSIotLogsV2 \
  --start-time $starttime --filter-pattern "{$.logLevel = INFO}"

# 過去1時間のERRORレベルのログを検索します
# 許可されていないトピックへのメッセージ発行時のエラーなどが表示されます
aws logs filter-log-events --log-group-name AWSIotLogsV2 \
  --start-time $starttime --filter-pattern "{$.logLevel = ERROR}"

# 特定のモノに関するログを検索します
aws logs filter-log-events --log-group-name AWSIotLogsV2 \
  --start-time $starttime --filter-pattern "{$.clientId = $THING_NAME}"