🤣
Lambdaのログを目視で探しているのは多分自分だけ
TL;DR
- CloudWatch Logs Insightsを使えばログの検索ができる
- 構造化ログを出力したらフィールド検索ができる
- 例)
level
がERROR
のログを検索する
fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc
きっかけ
「昨日からLambdaでエラーが発生しているっぽいから調査してほしい」
こういう依頼が来たので、自分は対象のログを探すことにしました。
CloudWatchのログから 1つ1つ目視で せっせと探しました。
そんな自分を見てメンバーが言いました。
・・・
CloudWatch Logs Insightsとは?
- CloudWatchのログを効率的に検索できるサービス
- 例)メッセージ「ERROR」を含むログを検索
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 50
- JSON形式で出力されたログの各フィールドに対して、直接検索が可能
- 例)
level
がERROR
のログを検索
- 例)
fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc
実際に使ってみる
以下のLambda関数を作成して実際にログの検索を行ってみます。
ランタイムは Node.js
です。
TestFunction
export const handler = async (event, context) => {
// 現在のタイムスタンプを取得
const timestamp = new Date().toISOString();
// ログ出力(INFOレベル)
console.log(JSON.stringify({
level: 'INFO',
timestamp: timestamp,
functionName: context.functionName,
requestId: context.awsRequestId,
message: 'Lambda function invoked successfully',
}));
try {
if (!event || !event.key) {
throw new Error("Invalid input: 'key' is missing");
}
// ログ出力(INFOレベル)
console.log(JSON.stringify({
level: 'INFO',
timestamp: timestamp,
functionName: context.functionName,
requestId: context.awsRequestId,
message: 'Processing completed successfully'
}));
return {
statusCode: 200,
body: JSON.stringify({ message: 'Success', input: event })
};
} catch (error) {
// ログ出力(ERRORレベル)
console.error(JSON.stringify({
level: 'ERROR',
timestamp: timestamp,
functionName: context.functionName,
requestId: context.awsRequestId,
errorMessage: error.message,
stackTrace: error.stack
}));
return {
statusCode: 500,
body: JSON.stringify({ message: 'Error processing request', error: error.message })
};
}
};
Lambda関数を起動しログを生成します。
ここから Logs Insights を利用してログレベルが ERROR
のログを検索してみます。
使用するクエリ文
fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc
CloudWatchダッシュボードから
クエリの実行をすると、確かにログレベルが ERROR
のログを抽出できています。
やったね!
まとめ
- CloudWatch Logs Insightsを使うとログの検索ができる
- 構造化ログ形式で出力すると、フィールドに対して検索ができる
- CloudWatch Logs Insightsは検索対象のデータ量に対して課金が発生する
というわけでCloudWatchのログを1つ1つ確認して時間を無駄にした話でした。
Discussion