AWS

CloudWatch Java 로그 작성 방법

devfinger 2024. 11. 29. 09:44

1. AWS Lambda에서 CloudWatch Logs 작성하기

AWS Lambda는 기본적으로 CloudWatch Logs와 통합됩니다. Java Lambda 함수에서 로그를 작성하는 방법은 여러 가지가 있습니다:

(1) System.out.println 사용

Lambda 함수의 표준 출력(System.out.println)은 자동으로 CloudWatch Logs로 전송됩니다.

public class MyLambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        System.out.println("This is a log message using System.out");
        return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody("OK");
    }
}

(2) AWS Lambda Logger 사용

Lambda의 Context 객체에서 제공하는 Logger를 사용할 수 있습니다.

@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
    context.getLogger().log("This is a log message using Context Logger");
    return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody("OK");
}

(3) Logback 또는 SLF4J와 같은 Java 로깅 프레임워크 사용

일반적으로 SLF4J와 같은 로깅 프레임워크를 사용하여 로그를 생성하면 더 정교하게 로그를 관리할 수 있습니다.

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

public class MyLambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    private static final Logger logger = LoggerFactory.getLogger(MyLambdaHandler.class);

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        logger.info("Info level log");
        logger.warn("Warning level log");
        logger.error("Error level log");
        return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody("OK");
    }
}

2. 로그 레벨별로 작성하기

로깅 프레임워크(예: Logback, Log4j, SLF4J)를 사용하면 로그 레벨별로 로그를 작성할 수 있습니다. 주요 로그 레벨은 다음과 같습니다:

  • TRACE: 가장 상세한 디버깅 정보.
  • DEBUG: 디버깅 목적의 상세 정보.
  • INFO: 일반적인 실행 정보.
  • WARN: 경고, 문제는 없지만 주의가 필요한 상황.
  • ERROR: 에러가 발생한 상황.

Logback 예제 (logback.xml)

logback.xml 파일을 설정하여 로그 레벨과 출력을 제어할 수 있습니다:

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

3. 로그 레벨 동적 변경

(1) Lambda 환경변수 사용

Lambda 환경변수를 활용하여 실행 중 로그 레벨을 변경할 수 있습니다:

  1. Lambda의 환경변수 LOG_LEVEL을 설정 (예: INFO, DEBUG).
  2. 코드를 수정하여 환경변수를 읽고 로그 레벨을 설정.
 
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.Level;

public class MyLambdaHandler {
    private static final Logger logger = (Logger) LoggerFactory.getLogger(MyLambdaHandler.class);

    public MyLambdaHandler() {
        String logLevel = System.getenv("LOG_LEVEL");
        if (logLevel != null) {
            logger.setLevel(Level.toLevel(logLevel));
        }
    }
}

(2) CloudWatch Logs Insights에서 로그 필터링

CloudWatch Logs Insights를 사용하여 특정 로그 레벨만 검색하거나 분석할 수 있습니다:

fields @timestamp, @message
| filter @message like "ERROR"
| sort @timestamp desc
| limit 20

4. CloudWatch Logs에서 로그 보기

CloudWatch에서 로그를 확인하려면 Log GroupLog Stream을 사용합니다.

  • Log Group: Lambda 함수 이름별로 생성.
  • Log Stream: 각 Lambda 함수 실행별로 구분.

Logs Insights로 로그 검색

AWS Console의 Logs Insights를 사용하면 특정 조건으로 로그를 검색할 수 있습니다. 예를 들어:

  1. 최근 1시간 동안 ERROR 로그 확인
fields @timestamp, @message
| filter @message like "ERROR"
| sort @timestamp desc

 

   2. 특정 텍스트가 포함된 로그 검색

fields @timestamp, @message
| filter @message like "DB connection error"
| sort @timestamp desc

5. 로그 관리 및 유지 전략

CloudWatch Logs는 기본적으로 로그가 축적되므로 관리가 필요합니다.

(1) 로그 보존 기간 설정

Lambda 함수의 Log Group에서 로그 보존 기간을 설정할 수 있습니다:

  • 기본값: 무제한.
  • 설정 방법:
     
aws logs put-retention-policy --log-group-name "/aws/lambda/MyFunction" --retention-in-days 30

(2) 로그 필터와 알람 설정

특정 패턴이 포함된 로그에 대해 알람을 설정합니다:

  1. CloudWatch Logs에서 Metric Filter 생성.
  2. 특정 패턴(예: ERROR)에 해당하는 로그를 필터링.
  3. CloudWatch Alarm 연결.

(3) 로그 전송 및 아카이브

장기적인 로그 보관을 위해 로그를 S3로 전송하거나, 분석을 위해 Amazon OpenSearch(Elasticsearch)로 전송합니다:

  1. S3로 로그 전송:
aws logs create-export-task --task-name "ExportLogsToS3" \
    --log-group-name "/aws/lambda/MyFunction" \
    --from 0 --to 1609459200000 \
    --destination "my-log-bucket"
  1. OpenSearch로 로그 전송: AWS Lambda에 Kinesis Data Firehose를 설정하여 OpenSearch로 전달.

6. 요약

  • 로그는 System.out.println, Lambda Context Logger, 또는 SLF4J와 같은 로깅 프레임워크를 통해 작성.
  • 로깅 레벨은 logback.xml 설정이나 Lambda 환경변수로 동적 변경 가능.
  • CloudWatch Logs Insights로 검색 및 필터링 수행.
  • 로그 관리는 보존 기간 설정, S3/Elasticsearch로 전송, 그리고 알람 설정으로 최적화.

'AWS' 카테고리의 다른 글

Lambda Cold Start 해결 방법  (0) 2024.12.12
AWS Lambda Log 동적 변경  (1) 2024.11.29
vpc flow logs, cloudwatch, cloudtrail  (0) 2024.11.28
Java Lambda template.yaml 관리  (0) 2024.11.18
Lambda Java DB 연결 변수 관리  (2) 2024.11.18