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

以前のカスタム appender を Log4j™1.2 に使用する (推奨されません)

注記

Log4j v1.2 カスタム appender のサポートには、End-of-Life がマークされています。開発中の更新は受け取らず、使用することはお勧めしません。詳細については、「Log4j 1.2」を参照してください。

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

例 : Log4J v1.2 を使用してログを書き込む (推奨されません)

注記

Log4j のバージョン1.x にはサポート終了のマークが付いています。詳細については、「Log4j 1.2」を参照してください。

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

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) を使用します。

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 ランタイムは、MDCAWSRequestId をlog4j コンテキストに追加します (「Class MDC for log4j v 1.2 および Class ThreadContext」を参照)。例のようにこの値を取得するため、%X{AWSRequestId} ファイルの変換パターンに log4.properties を追加しました。

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

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

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

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

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

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

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