Java Lambda 함수 로그 및 모니터링

Java Lambda 함수 로그 및 모니터링 (Log and monitor Java Lambda functions)

AWS Lambda는 Lambda 함수를 자동으로 모니터링하고 로그 항목을 Amazon CloudWatch로 보내요. Lambda 함수에는 CloudWatch Logs 로그 그룹과 함수 인스턴스마다 로그 스트림이 함께 제공돼요. Lambda 런타임 환경은 각 호출에 대한 세부 정보와 함수 코드의 기타 출력을 로그 스트림으로 보내요. CloudWatch Logs에 대한 자세한 내용은 Lambda 함수 로그를 CloudWatch Logs로 보내기를 참고하세요.

출처: AWS Lambda 개발자 안내서

본문

함수 코드에서 로그를 출력하려면 java.lang.System의 메서드나 stdout 또는 stderr 에 쓰는 로깅 모듈을 사용할 수 있어요.

로그를 반환하는 함수 만들기 (Creating a function that returns logs)

함수 코드에서 로그를 출력하려면 java.lang.System의 메서드나 stdout 또는 stderr 에 쓰는 어떤 로깅 모듈이든 사용할 수 있어요. aws-lambda-java-core 라이브러리는 컨텍스트 객체에서 접근할 수 있는 LambdaLogger 라는 로거 클래스를 제공해요. 이 로거 클래스는 다중 라인 로그를 지원해요.

다음 예제는 컨텍스트 객체가 제공하는 LambdaLogger 로거를 사용해요.

예제 Handler.java

// Handler value: example.Handler
public class Handler implements RequestHandler<Object, String>{
  Gson gson = new GsonBuilder().setPrettyPrinting().create();
  @Override
  public String handleRequest(Object event, Context context)
  {
    LambdaLogger logger = context.getLogger();
    String response = new String("SUCCESS");
    // log execution details
    logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
    logger.log("CONTEXT: " + gson.toJson(context));
    // process event
    logger.log("EVENT: " + gson.toJson(event));
    return response;
  }
}

예제 로그 형식

START RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Version: $LATEST
ENVIRONMENT VARIABLES:
{
    "_HANDLER": "example.Handler",
    "AWS_EXECUTION_ENV": "AWS_Lambda_java8",
    "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",
    ...
}
CONTEXT:
{
    "memoryLimit": 512,
    "awsRequestId": "6bc28136-xmpl-4365-b021-0ce6b2e64ab0",
    "functionName": "java-console",
    ...
}
EVENT:
{
  "records": [
    {
      "messageId": "19dd0b57-xmpl-4ac1-bd88-01bbb068cb78",
      "receiptHandle": "MessageReceiptHandle",
      "body": "Hello from SQS!",
       ...
    }
  ]
}
END RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0
REPORT RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0	Duration: 198.50 ms	Billed Duration: 724 ms	Memory Size: 512 MB	Max Memory Used: 90 MB	Init Duration: 524.75 ms

Java 런타임은 각 호출에 대해 START, END, REPORT 줄을 로그로 기록해요. REPORT 줄은 다음 세부 정보를 제공해요.

  • RequestId – 호출의 고유 요청 ID예요.
  • Duration – 함수의 핸들러 메서드가 이벤트를 처리하는 데 소비한 시간이에요.
  • Billed Duration – 호출에 대해 청구된 시간이에요.
  • Memory Size – 함수에 할당된 메모리 양이에요.
  • Max Memory Used – 함수가 사용한 메모리 양이에요. 호출이 실행 환경을 공유할 때 Lambda는 모든 호출에 걸쳐 사용된 최대 메모리를 보고해요. 이 동작으로 인해 보고된 값이 예상보다 높을 수 있어요.
  • Init Duration – 제공된 첫 요청에 대해 런타임이 함수를 로드하고 핸들러 메서드 밖의 코드를 실행하는 데 걸린 시간이에요.
  • XRAY TraceId – 추적된 요청의 경우 AWS X-Ray 추적 ID예요.
  • SegmentId – 추적된 요청의 경우 X-Ray 세그먼트 ID예요.
  • Sampled – 추적된 요청의 경우 샘플링 결과예요.

Java로 Lambda 고급 로깅 제어 사용 (Using Lambda advanced logging controls with Java)

함수의 로그가 캡처, 처리, 소비되는 방식에 대한 더 많은 제어를 제공하기 위해 지원되는 Java 런타임에 대해 다음 로깅 옵션을 구성할 수 있어요.

  • 로그 형식(Log format) — 함수 로그에 대해 일반 텍스트와 구조화된 JSON 형식 중 선택해요.
  • 로그 수준(Log level) — JSON 형식 로그의 경우 Lambda가 CloudWatch로 보내는 로그의 세부 수준(예: ERROR, DEBUG, INFO)을 선택해요.
  • 로그 그룹(Log group) — 함수가 로그를 보내는 CloudWatch 로그 그룹을 선택해요.

이러한 로깅 옵션에 대한 자세한 내용과 이를 사용하도록 함수를 구성하는 지침은 Lambda 함수용 고급 로깅 제어 구성을 참고하세요.

Java Lambda 함수에서 로그 형식과 로그 수준 옵션을 사용하려면 다음 섹션의 지침을 참고하세요.

Java로 구조화된 JSON 로그 형식 사용 (Using structured JSON log format with Java)

함수의 로그 형식으로 JSON을 선택하면 Lambda는 LambdaLogger 클래스를 사용해 출력된 로그를 구조화된 JSON으로 보내요. 각 JSON 로그 객체에는 다음 키를 가진 키-값 쌍이 최소 네 개 포함돼요.

  • "timestamp" — 로그 메시지가 생성된 시간
  • "level" — 메시지에 할당된 로그 수준
  • "message" — 로그 메시지의 내용
  • "AWSrequestId" — 함수 호출의 고유 요청 ID

사용하는 로깅 메서드에 따라 JSON 형식으로 캡처된 함수 출력 로그에 추가 키-값 쌍이 포함될 수도 있어요.

LambdaLogger 로거로 만든 로그에 수준을 할당하려면 다음 예제처럼 로깅 명령에 LogLevel 인자를 제공해야 해요.

예제 Java 로깅 코드

LambdaLogger logger = context.getLogger();
logger.log("This is a debug log", LogLevel.DEBUG);

이 예제 코드가 출력하는 로그는 CloudWatch Logs에 다음과 같이 캡처돼요.

예제 JSON 로그 레코드

{
    "timestamp":"2023-11-01T00:21:51.358Z",
    "level":"DEBUG",
    "message":"This is a debug log",
    "AWSrequestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f"
}

로그 출력에 수준을 할당하지 않으면 Lambda가 자동으로 INFO 수준을 할당해요.

코드가 이미 다른 로깅 라이브러리를 사용해 JSON 구조화 로그를 생성한다면 변경할 필요가 없어요. Lambda는 이미 JSON으로 인코딩된 로그를 이중 인코딩하지 않아요. 함수를 JSON 로그 형식으로 구성해도 로깅 출력은 정의한 JSON 구조로 CloudWatch에 나타나요.

Java로 로그 수준 필터링 사용 (Using log-level filtering with Java)

AWS Lambda가 애플리케이션 로그를 로그 수준에 따라 필터링하려면 함수가 JSON 형식의 로그를 사용해야 해요. 두 가지 방법으로 할 수 있어요.

함수를 로그 수준 필터링을 사용하도록 구성할 때 Lambda가 CloudWatch Logs로 보내길 원하는 로그 수준에 대해 다음 옵션 중에서 선택해야 해요.

로그 수준 일반적인 용도
TRACE(가장 상세) 코드 실행 경로를 추적하는 데 사용되는 가장 세밀한 정보
DEBUG 시스템 디버깅을 위한 상세 정보
INFO 함수의 정상 작동을 기록하는 메시지
WARN 해결되지 않으면 예기치 않은 동작을 초래할 수 있는 잠재적 오류에 대한 메시지
ERROR 코드가 예상대로 수행되지 못하게 하는 문제에 대한 메시지
FATAL(가장 덜 상세) 애플리케이션 작동을 중단시키는 심각한 오류에 대한 메시지

Lambda가 함수의 로그를 필터링하려면 JSON 로그 출력에 "timestamp" 키-값 쌍도 포함해야 해요. 시간은 유효한 RFC 3339 타임스탬프 형식으로 지정해야 해요. 유효한 타임스탬프를 제공하지 않으면 Lambda는 로그에 INFO 수준을 할당하고 타임스탬프를 추가해줘요.

Lambda는 선택한 수준과 그 이하의 로그를 CloudWatch로 보내요. 예를 들어 로그 수준을 WARN으로 구성하면 Lambda는 WARN, ERROR, FATAL 수준에 해당하는 로그를 보내요.

Log4j2와 SLF4J로 고급 로깅 구현 (Implementing advanced logging with Log4j2 and SLF4J)

참고

AWS Lambda는 관리 런타임이나 기본 컨테이너 이미지에 Log4j2를 포함하지 않아요. 따라서 CVE-2021-44228, CVE-2021-45046, CVE-2021-45105에 설명된 문제의 영향을 받지 않아요.

영향을 받는 Log4j2 버전을 포함하는 고객 함수의 경우 CVE-2021-44228, CVE-2021-45046, CVE-2021-45105의 문제를 완화하는 데 도움이 되는 변경을 Lambda Java 관리 런타임과 기본 컨테이너 이미지에 적용했어요. 이 변경으로 Log4J2를 사용하는 고객은 " Transforming org/apache/logging/log4j/core/lookup/JndiLookup (java.net.URLClassLoader@...) "와 유사한 추가 로그 항목을 볼 수 있어요. Log4J2 출력에서 jndi 매퍼를 참조하는 모든 로그 문자열은 " Patched JndiLookup::lookup() "로 대체돼요.

이 변경과 별개로, 함수에 Log4j2를 포함하는 모든 고객이 최신 버전으로 업데이트할 것을 강력히 권장해요. 특히 함수에서 aws-lambda-java-log4j2 라이브러리를 사용하는 고객은 1.5.0(또는 이후) 버전으로 업데이트하고 함수를 다시 배포해야 해요. 이 버전은 기본 Log4j2 유틸리티 종속성을 2.17.0(또는 이후) 버전으로 업데이트해요. 업데이트된 aws-lambda-java-log4j2 바이너리는 Maven 저장소에서, 그 소스 코드는 Github에서 볼 수 있어요.

마지막으로 aws-lambda-java-log4j (v1.0.0 또는 1.0.1) 와 관련된 라이브러리는 어떠한 경우에도 사용해서는 안 돼요. 이 라이브러리는 2015년에 지원이 종료된 1.x 버전의 log4j와 관련돼요. 이 라이브러리는 지원되지 않고, 유지 관리되지 않으며, 패치되지 않았고, 알려진 보안 취약점이 있어요.

로그 출력을 커스터마이즈하고, 단위 테스트 중 로깅을 지원하며, AWS SDK 호출을 로깅하려면 SLF4J와 함께 Apache Log4j2를 사용해요. Log4j는 로그 수준을 구성하고 appender 라이브러리를 사용할 수 있는 Java 프로그램용 로깅 라이브러리예요. SLF4J는 함수 코드를 변경하지 않고 어떤 라이브러리를 사용할지 변경할 수 있는 퍼사드(facade) 라이브러리예요.

요청 ID를 함수의 로그에 추가하려면 aws-lambda-java-log4j2 라이브러리의 appender를 사용해요.

예제 src/main/resources/log4j2.xml – Appender 구성

<Configuration>
  <Appenders>
    <Lambda name="Lambda" format="${env:AWS_LAMBDA_LOG_FORMAT:-TEXT}">
       <LambdaTextFormat>
         <PatternLayout>
             <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n </pattern>
         </PatternLayout>
       </LambdaTextFormat>
       <LambdaJSONFormat>
         <JsonTemplateLayout eventTemplateUri="classpath:LambdaLayout.json" />
       </LambdaJSONFormat>
     </Lambda>
   </Appenders>
   <Loggers>
     <Root level="${env:AWS_LAMBDA_LOG_LEVEL:-INFO}">
       <AppenderRef ref="Lambda"/>
     </Root>
     <Logger name="software.amazon.awssdk" level="WARN" />
     <Logger name="software.amazon.awssdk.request" level="DEBUG" />
   </Loggers>
 </Configuration>

<LambdaTextFormat> 와 <LambdaJSONFormat> 태그 아래에 layout을 지정해 Log4j2 로그를 일반 텍스트 또는 JSON 출력으로 구성하는 방법을 결정할 수 있어요.

이 예제에서 텍스트 모드에서는 각 줄 앞에 날짜, 시간, 요청 ID, 로그 수준, 클래스 이름이 붙어요. JSON 모드에서는 aws-lambda-java-log4j2 라이브러리와 함께 제공되는 구성으로 <JsonTemplateLayout> 이 사용돼요.

SLF4J는 Java 코드 로깅용 퍼사드 라이브러리예요. 함수 코드에서 SLF4J 로거 팩토리를 사용해 info() 와 warn() 같은 로그 수준 메서드가 있는 로거를 검색해요. 빌드 구성에서 로깅 라이브러리와 SLF4J 어댑터를 classpath에 포함해요. 빌드 구성의 라이브러리를 변경하면 함수 코드를 변경하지 않고 로거 타입을 변경할 수 있어요. SLF4J는 SDK for Java에서 로그를 캡처하는 데 필요해요.

다음 예제 코드에서 핸들러 클래스는 SLF4J를 사용해 로거를 검색해요.

예제 src/main/java/example/HandlerS3.java – SLF4J로 로깅

package example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;

import static org.apache.logging.log4j.CloseableThreadContext.put;

public class HandlerS3 implements RequestHandler<S3Event, String>{
    private static final Logger logger = LoggerFactory.getLogger(HandlerS3.class);

    @Override
    public String handleRequest(S3Event event, Context context) {
        for(var record : event.getRecords()) {
            try (var loggingCtx = put("awsRegion", record.getAwsRegion())) {
                loggingCtx.put("eventName", record.getEventName());
                loggingCtx.put("bucket", record.getS3().getBucket().getName());
                loggingCtx.put("key", record.getS3().getObject().getKey());

                logger.info("Handling s3 event");
            }
        }

        return "Ok";
    }
}

이 코드는 다음과 같은 로그 출력을 생성해요.

예제 로그 형식

{
    "timestamp": "2023-11-15T16:56:00.815Z",
    "level": "INFO",
    "message": "Handling s3 event",
    "logger": "example.HandlerS3",
    "AWSRequestId": "0bced576-3936-4e5a-9dcd-db9477b77f97",
    "awsRegion": "eu-south-1",
    "bucket": "java-logging-test-input-bucket",
    "eventName": "ObjectCreated:Put",
    "key": "test-folder/"
}

빌드 구성은 Lambda appender와 SLF4J 어댑터를 런타임 종속성으로, Log4j2를 구현 종속성으로 받아요.

예제 build.gradle – 로깅 종속성

dependencies {
    ...
    'com.amazonaws:aws-lambda-java-log4j2:[1.6.0,)',
    'com.amazonaws:aws-lambda-java-events:[3.11.3,)',
    'org.apache.logging.log4j:log4j-layout-template-json:[2.17.1,)',
    'org.apache.logging.log4j:log4j-slf4j2-impl:[2.19.0,)',
    ...
}

테스트를 위해 코드를 로컬에서 실행할 때는 Lambda 로거가 있는 컨텍스트 객체를 사용할 수 없고 Lambda appender가 사용할 요청 ID도 없어요. 예제 테스트 구성은 다음 섹션의 샘플 애플리케이션을 참고하세요.

기타 로깅 도구 및 라이브러리 사용 (Using other logging tools and libraries)

Powertools for AWS Lambda (Java)는 Serverless 모범 사례를 구현하고 개발자 속도를 높이기 위한 개발자 툴킷이에요. Logging 유틸리티는 모든 함수의 함수 컨텍스트에 대한 추가 정보를 포함하고 JSON으로 구조화된 출력을 제공하는 Lambda 최적화 로거를 제공해요. 이 유틸리티를 사용해 다음을 수행할 수 있어요.

  • Lambda 컨텍스트의 주요 필드를 캡처하고, 콜드 스타트와 구조화된 로깅 출력을 JSON으로 생성
  • 지시된 경우 Lambda 호출 이벤트 로깅(기본적으로 비활성화)
  • 로그 샘플링을 통해 호출의 일정 비율에 대해서만 모든 로그 출력(기본적으로 비활성화)
  • 어느 시점이든 구조화된 로그에 추가 키 추가
  • 커스텀 로그 포맷터(Bring Your Own Formatter)를 사용해 조직의 Logging RFC와 호환되는 구조로 로그 출력

구조화 로깅용 Powertools for AWS Lambda(Java)와 AWS SAM 사용 (Using Powertools for AWS Lambda (Java) and AWS SAM for structured logging)

아래 단계에 따라 AWS SAM을 사용해 Powertools for AWS Lambda (Java) 모듈이 통합된 샘플 Hello World Java 애플리케이션을 다운로드, 빌드, 배포해요. 이 애플리케이션은 기본 API 백엔드를 구현하고 로그, 메트릭, 트레이스를 내보내기 위해 Powertools를 사용해요. Amazon API Gateway 엔드포인트와 Lambda 함수로 구성돼요. API Gateway 엔드포인트에 GET 요청을 보내면 Lambda 함수가 호출되어 Embedded Metric Format으로 로그와 메트릭을 CloudWatch로 보내고 트레이스를 AWS X-Ray로 보내요. 함수는 hello world 메시지를 반환해요.

사전 요구 사항

샘플 AWS SAM 애플리케이션 배포

  1. Hello World Java 템플릿으로 애플리케이션을 초기화해요.
    sam init --app-template hello-world-powertools-java --name sam-app --package-type Zip --runtime java11 --no-tracing
    
  2. 앱을 빌드해요.
    cd sam-app && sam build
    
  3. 앱을 배포해요.
    sam deploy --guided
    
  4. 화면의 프롬프트를 따라가요. 대화형 환경에서 제공되는 기본 옵션을 수락하려면 Enter 를 눌러요.

    참고

    HelloWorldFunction may not have authorization defined, Is this okay? 에 대해 y 를 입력해야 해요.

  5. 배포된 애플리케이션의 URL을 가져와요.
    aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
    
  6. API 엔드포인트를 호출해요.
    curl -X GET <URL_FROM_PREVIOUS_STEP>
    
    성공하면 다음 응답이 보여요.
    {"message":"hello world"}
    
  7. 함수의 로그를 보려면 sam logs를 실행해요. 자세한 내용은 AWS Serverless Application Model Developer Guide의 Working with logs를 참고하세요.
    sam logs --stack-name sam-app
    
    로그 출력은 다음과 같아요.
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.095000 INIT_START Runtime Version: java:11.v15    Runtime Version ARN: arn:aws:lambda:eu-central-1::runtime:0a25e3e7a1cc9ce404bc435eeb2ad358d8fa64338e618d0c224fe509403583ca
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.114000 Picked up JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:34.793000 Transforming org/apache/logging/log4j/core/lookup/JndiLookup (lambdainternal.CustomerClassLoader@1a6c5a9e)
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:35.252000 START RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765 Version: $LATEST
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:37.331000 09:24:37.294 [main] INFO  helloworld.App - {"version":null,"resource":"/hello",...}
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 END RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765
    2025/09/03/[$LATEST]851411a899b545eea2cffeba4cfbec81 2023-02-03T09:24:39.371000 REPORT RequestId: 7fcf1548-d2d4-41cd-a9a8-6ae47c51f765    Duration: 4118.98 ms    Billed Duration: 5275 ms    Memory Size: 512 MB    Max Memory Used: 152 MB    Init Duration: 1155.47 ms
    XRAY TraceId: 1-63dcd2d1-25f90b9d1c753a783547f4dd    SegmentId: 3a028fee19b895cb    Sampled: true
    
  8. 이 공개 API 엔드포인트는 인터넷을 통해 접근 가능해요. 테스트 후에는 엔드포인트를 삭제하는 것을 권장해요.
    sam delete
    

로그 보존 관리

함수를 삭제해도 로그 그룹은 자동으로 삭제되지 않아요. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나 CloudWatch가 로그를 자동으로 삭제하는 보존 기간을 구성해요. 로그 보존을 설정하려면 AWS SAM 템플릿에 다음을 추가해요.

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      # Omitting other properties

  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
      RetentionInDays: 7

Lambda 콘솔에서 로그 보기 (Viewing logs in the Lambda console)

Lambda 함수를 호출한 후 Lambda 콘솔을 사용해 로그 출력을 볼 수 있어요.

내장 Code 편집기에서 코드를 테스트할 수 있다면 execution results 에서 로그를 찾을 수 있어요. 콘솔 테스트 기능으로 함수를 호출하면 Details 섹션에서 Log output 을 찾을 수 있어요.

CloudWatch 콘솔에서 로그 보기 (Viewing logs in the CloudWatch console)

Amazon CloudWatch 콘솔을 사용해 모든 Lambda 함수 호출의 로그를 볼 수 있어요.

CloudWatch 콘솔에서 로그 보기

  1. CloudWatch 콘솔의 Log groups 페이지를 열어요.
  2. 함수의 로그 그룹( /aws/lambda/your-function-name)을 선택해요.
  3. 로그 스트림을 선택해요.

각 로그 스트림은 함수의 인스턴스 하나에 대응해요. Lambda 함수를 업데이트할 때와 동시 호출을 처리하기 위해 추가 인스턴스가 생성될 때 로그 스트림이 나타나요. 특정 호출의 로그를 찾으려면 함수를 AWS X-Ray로 계측하는 것을 권장해요. X-Ray는 요청과 로그 스트림에 대한 세부 정보를 트레이스에 기록해요.

AWS Command Line Interface(AWS CLI)로 로그 보기 (Viewing logs using the AWS CLI)

AWS CLI는 명령줄 셸에서 명령을 사용해 AWS 서비스와 상호작용할 수 있는 오픈소스 도구예요. 이 섹션의 단계를 완료하려면 AWS CLI 버전 2가 있어야 해요.

AWS CLI를 사용해 --log-type 명령 옵션으로 호출의 로그를 검색할 수 있어요. 응답에는 호출에서 base64로 인코딩된 로그 최대 4KB를 담는 LogResult 필드가 포함돼요.

예제 로그 ID 검색

다음 예제는 my-function 이라는 함수의 LogResult 필드에서 log ID 를 검색하는 방법을 보여줘요.

aws lambda invoke --function-name my-function out --log-type Tail

다음 출력이 보여야 해요.

{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}

예제 로그 디코딩

같은 명령 프롬프트에서 base64 유틸리티를 사용해 로그를 디코딩해요. 다음 예제는 my-function 의 base64 인코딩된 로그를 검색하는 방법을 보여줘요.

aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요해요. 이것을 기본 설정으로 만들려면 aws configure set cli-binary-format raw-in-base64-out 을 실행해요. 자세한 내용은 AWS Command Line Interface User Guide for Version 2의 AWS CLI 지원 글로벌 명령줄 옵션을 참고하세요.

다음 출력이 보여야 해요.

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB

base64 유틸리티는 Linux, macOS, Ubuntu on Windows에서 사용할 수 있어요. macOS 사용자는 base64 -D 를 사용해야 할 수 있어요.

예제 get-logs.sh 스크립트

같은 명령 프롬프트에서 다음 스크립트를 사용해 마지막 다섯 개의 로그 이벤트를 다운로드해요. 이 스크립트는 sed를 사용해 출력 파일에서 따옴표를 제거하고, 로그를 사용할 수 있을 때까지 15초 동안 대기해요. 출력에는 Lambda의 응답과 get-log-events 명령의 출력이 포함돼요.

다음 코드 샘플의 내용을 복사해 Lambda 프로젝트 디렉터리에 get-logs.sh 로 저장해요.

cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요해요. 이것을 기본 설정으로 만들려면 aws configure set cli-binary-format raw-in-base64-out 을 실행해요.

#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5

예제 macOS 및 Linux(전용)

같은 명령 프롬프트에서 macOS와 Linux 사용자는 스크립트가 실행 가능한지 확인하기 위해 다음 명령을 실행해야 할 수 있어요.

chmod -R 755 get-logs.sh

예제 마지막 다섯 개 로그 이벤트 검색

같은 명령 프롬프트에서 다음 스크립트를 실행해 마지막 다섯 개 로그 이벤트를 가져와요.

./get-logs.sh

다음 출력이 보여야 해요.

{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}

로그 삭제 (Deleting logs)

함수를 삭제해도 로그 그룹은 자동으로 삭제되지 않아요. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나, 로그가 자동으로 삭제되는 보존 기간을 구성해요.

샘플 로깅 코드 (Sample logging code)

이 가이드의 GitHub 저장소에는 다양한 로깅 구성의 사용을 보여주는 샘플 애플리케이션이 있어요. 각 샘플 애플리케이션에는 손쉬운 배포와 정리를 위한 스크립트, AWS SAM 템플릿, 지원 리소스가 포함돼 있어요.

  • example-java – Lambda로 주문을 처리하는 방법을 보여주는 Java 함수예요. 이 함수는 커스텀 입력 이벤트 객체를 정의하고 역직렬화하며, AWS SDK를 사용하고, 로깅을 출력하는 방법을 보여줘요.
  • java-basic – 단위 테스트와 다양한 로깅 구성을 갖춘 최소한의 Java 함수 모음이에요.
  • java-events – Amazon API Gateway, Amazon SQS, Amazon Kinesis 같은 다양한 서비스의 이벤트를 처리하는 방법에 대한 스켈레톤 코드가 있는 Java 함수 모음이에요. 이 함수들은 최신 버전의 aws-lambda-java-events 라이브러리(3.0.0 이상)를 사용해요. 이 예제는 종속성으로 AWS SDK를 필요로 하지 않아요.
  • s3-java – Amazon S3의 알림 이벤트를 처리하고 Java Class Library(JCL)를 사용해 업로드된 이미지 파일에서 썸네일을 만드는 Java 함수예요.
  • layer-java – Lambda 레이어를 사용해 핵심 함수 코드와 별도로 종속성을 패키징하는 방법을 보여주는 Java 함수예요.

java-basic 샘플 애플리케이션은 로깅 테스트를 지원하는 최소 로깅 구성을 보여줘요. 핸들러 코드는 컨텍스트 객체가 제공하는 LambdaLogger 로거를 사용해요. 테스트를 위해 애플리케이션은 Log4j2 로거로 LambdaLogger 인터페이스를 구현하는 커스텀 TestLogger 클래스를 사용해요. AWS SDK와의 호환성을 위해 퍼사드로 SLF4J를 사용해요. 배포 패키지를 작게 유지하기 위해 로깅 라이브러리는 빌드 출력에서 제외돼요.

더 알아보기 (Learn more)