今年のre:Inventでは多くの新サービス/新機能が発表されましたがその中の一つCloudWatch Logs Insightsについて(備忘録も兼ねて)簡単にまとめます。
CloudWatch Logs Insightsとは
- CloudWatch Logsのログデータを簡単に検索したり分析できる
- クエリ言語を使ってログを操作
- 料金
- スキャンされたデータ 1 GB あたり 0.0076 USD
- 参考
Log Fields
以下の3つのログフィールドはログの種類にかかわらず自動で生成されます
@message
: ログのメッセージ本文
@timestamp
: タイムスタンプ
@logStream
: ログストリーム名
また、ログの種類によっては、そのほかのフィールドが自動で検知されCloudWatchコンソールの右下に検出されたフィールド
として表示されます
例えばLambdaの実行ログにクエリを発行したい場合@requestId
, @duration
, @billedDuration
, @type
, @maxMemoryUsed
, @memorySize
などが利用できます
そのほかログの種類によって利用できるフィールドの一覧はドキュメントにあります
Command
以下6つのコマンドを実行できます
-
fields
: フィールドを取得してくることができます,また後述する関数と組み合わせることで取得したフィールドに加工を加えることもできます -
filter
: フィールドを絞り込みます -
stats
: 後述する関数と組み合わせることで様々な集計計算ができます -
sort
: 降順、昇順で結果をソートできます -
limit
: クエリの実行結果数を制限できます -
parse
: ログフィールドからデータを取り出すことができます
parseについてはもう少し追記しておくと, 例えばログメッセージの中から例外が発生したメッセージの内容だけ取り出したいときに
fields @message
| filter @message like /Exception/
| parse "*:*" as errorCode, errorMessage
のように使うイメージです
Functions
クエリ内では以下の関数を使うこともできます
General Functions
-
ispresent
: フィールドが存在するか真偽値を返す -
coalesce
: リストの中から最初のnullでない値を返す
String Functions
-
isempty
: フィールドが存在しないもしくは空の時trueを返す -
concat
: 文字列を連結する -
trim
: 文字列をトリムする -
strlen
: 文字列の長さを返す
など
Aggregation Functions in the Stats Command
stats
コマンド内で使える集計関数もあります
-
avg
,count
,sum
など
そのほかいくつか利用可能なオペレーションや関数がありますので詳しくはドキュメントを参照してください。
試してみる
例えば,logger.error()
などで出力したエラーログのうち最新20件の発生箇所と該当コードだけ抜き出してみたいときは以下のようにクエリを書くことで簡単に参照できるかと思います。
filter @type = 'ERROR'
| parse @message "*:*:*" as message, place, code
| fields place, code
| sort @timestamp desc
| limit 20
まとめ
ドキュメント読めばわかるようなことをつらつら書いていてアレですが日本語ドキュメントがまだないようなので書きました。
上で紹介した機能以外にも集計結果をグラフ化したりクエリの結果をCloudWatchダッシュボードにエクスポートしたりクエリの履歴を参照することもできとても便利な機能が揃っています。
CloudWatchでのログの取り扱いに困っている方は一度試してみてください。