メニュー
AWS Lambda
開発者ガイド

ロギング (Java)

Lambda 関数にログ作成のステートメントを含めることができます。AWS Lambda はこれらのログを CloudWatch に書き込みます。次のいずれかを使用してログを書き込むことをお勧めします。

  • Log4j™ 1.2 のカスタム Appender

    AWS Lambda は、カスタム Appender を提供して Log4j 1.2 をサポートします。Lambda が提供するカスタム Log4j (「Apache log4j」を参照) Appender を、Lambda 関数からのログ記録に使用できます。log.debug() または log.error() など、Log4j メソッドへのあらゆる呼び出しは、CloudWatch Logs イベントを発生させます。カスタム Appender は LambdaAppender と呼ばれ、log4j.properties ファイルで使用する必要があります。aws-lambda-java-log4j アーティファクト (artifactId:aws-lambda-java-log4j) をデプロイパッケージ (.jar ファイル) に含める必要があります。例については、「例 1: Log4J を使用したログの書き込み (Java)」を参照してください。

    注記

    現在、AWS Lambda は Log4j 1.2 バージョンをサポートしています。

  • LambdaLogger.log()

    イベントサイズが許可されている制限内である場合、LambdaLogger.log() を呼び出すたびに CloudWatch Logs イベントが発生します。CloudWatch Logs の制限については、Amazon CloudWatch ユーザーガイド の「CloudWatch Logs の制限」を参照してください。例については、「例 2: LambdaLogger を使用したログの書き込み (Java)」を参照してください。

さらに、Lambda 関数コードで次のステートメントを使用してログエントリを生成することもできます。

  • System.out()

  • System.err()

ただし、AWS Lambda は、System.out および System.err で返される各行を別のイベントとして処理することに注意してください。この作業は、各出力行が 1 つのログエントリに対応するときに適しています。ログエントリに複数行の出力が含まれている場合、AWS Lambda は改行を使用してそれらの解析を試み、異なるイベントを識別します。たとえば、次のコードでは、2 つの単語 ("Hello" と "world") を 2 つの個別のイベントとして記録します。

Copy
System.out.println("Hello \n world");

ログの検索方法

Lambda 関数が書き込んだログは、次のように確認できます。

  • CloudWatch Logs でログを見つけます。context オブジェクト (aws-lambda-java-core ライブラリ) は、getLogStreamName() および getLogGroupName() メソッドを提供します。これらのメソッドを使用して、ログの書き込み先の特定のログストリームを見つけることができます。

  • コンソールを通じて Lambda 関数を呼び出す場合、呼び出しタイプは常に RequestResponse (同期実行) になります。コンソールは、Lambda 関数が LambdaLogger オブジェクトを使用して書き込むログを表示します。また、AWS Lambda は、System.out および System.err メソッドからログを返します。

  • Lambda 関数をプログラムで呼び出す場合、LogType パラメータを追加して、CloudWatch Logs に書き込まれるログデータの最後の 4 KB を取得できます。詳細については、「Invoke」を参照してください。AWS Lambda は、レスポンスの x-amz-log-results ヘッダーでこのログ情報を返します。AWS Command Line Interface を使用して関数を呼び出す場合、--log-type パラメータを値 Tail とともに指定できます。

ログ作成の例 (Java)

このセクションでは、Log4j のカスタム Appender および情報を記録するための LambdaLogger オブジェクトの使用例を示します。

例 1: Log4J を使用したログの書き込み (Java)

次の Java コード例では、AWS Lambda が情報を CloudWatch に記録する際の違いを示すため、System メソッドと Log4j の両方を使用してログを書き込みます。

Copy
package example; import com.amazonaws.services.lambda.runtime.Context; import org.apache.logging.log4j.Logger; public class Hello { // Initialize the Log4j logger. static final Logger log = Logger.getLogger(Hello.class); public String myHandler(String name, Context context) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr. \n this is a continuation of system.err"); // Use log4j to log the same thing as above and AWS Lambda will log only one event in CloudWatch. log.debug("log data from log4j debug \n this is continuation of log4j debug"); log.error("log data from log4j err. \n this is a continuation of log4j.err"); // Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); } }

この例では、次の log4j.properties ファイル (project-dir/src/main/resources/ directory) を使用します。

Copy
log = . log4j.rootLogger = DEBUG, LAMBDA #Define the LAMBDA appender log4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppender log4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayout log4j.appender.LAMBDA.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} <%X{AWSRequestId}> %-5p %c{1}:%m%n

次に示すのは、CloudWatch Logs のログエントリのサンプルです。

注意:

  • AWS Lambda は、改行のため、System.out.println() および System.err.println() の各ステートメントのログ文字列を、2 つの個別のイベントとして解析します (スクリーンショットの 2 つの下向き矢印に注目してください)。

  • Log4j のメソッド (log.debug() および log.error()) は、1 つの CloudWatch イベントを作成します。

  • AWS Lambda ランタイムは MDC に AWSRequestId を追加します (「クラス MDC」を参照)。例のようにこの値を取得するため、%X{AWSRequestId} ファイルの変換パターンに log4.properties を追加しました。

コードをテストするために、以下の操作を行うことができます。

  • コードを使用して、デプロイパッケージを作成します。プロジェクトで、log4j.propertiesproject-dir/src/main/resources/ ディレクトリに ファイルを追加し忘れないようにしてください。

  • デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。

  • Lambda 関数をテストするには、サンプルイベントとして文字列 ("this is a test") を使用します。ハンドラーコードはサンプルイベントを受信しますが、それに対して何も行いません。ログを書き込む方法のみを示します。

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 ステップ 2.3: (オプション) Java で Lambda 関数を作成する. 以下の違いに注意してください。

  • デプロイパッケージを作成するときに、aws-lambda-java-log4j ライブラリの依存関係を忘れないでください。

  • Lambda 関数を作成するときに、ハンドラー値として example.Hello::myHandler (package.class::method) を指定します。

例 2: LambdaLogger を使用したログの書き込み (Java)

次の Java コード例では、AWS Lambda が情報を CloudWatch に記録する方法の違いを示すため、System メソッドと LambdaLogger オブジェクトの両方を使用してログを書き込みます。

Copy
package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; public class Hello { public String myHandler(String name, Context context) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr \n this is continuation of system.err"); LambdaLogger logger = context.getLogger(); // Write log to CloudWatch using LambdaLogger. logger.log("log data from LambdaLogger \n this is continuation of logger.log"); // Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); } }

次に示すのは、CloudWatch Logs のログエントリのサンプルです。

注意:

  • AWS Lambda は、改行のため、System.out.println() および System.err.println() の各ステートメントのログ文字列を、2 つの個別のイベントとして解析します (スクリーンショットの 2 つの下向き矢印に注目してください)。

  • LambdaLogger.log() は 1 つの CloudWatch イベントを作成します。

コードをテストするために、以下の操作を行うことができます。

  • コードを使用して、デプロイパッケージを作成します。

  • デプロイパッケージを AWS Lambda にアップロードして Lambda 関数を作成します。

  • Lambda 関数をテストするには、サンプルイベントとして文字列 ("this is a test") を使用します。ハンドラーコードはサンプルイベントを受信しますが、それに対して何も行いません。ログを書き込む方法のみを示します。

「使用開始」セクションで説明している手順に従います。詳細については、次を参照してください。 ステップ 2.3: (オプション) Java で Lambda 関数を作成する. 以下の違いに注意してください。

  • デプロイパッケージを作成するときに、aws-lambda-java-core ライブラリの依存関係を忘れないでください。

  • Lambda 関数を作成するときに、ハンドラー値として example.Hello::myHandler (package.class::method) を指定します。