Cloudwatch 로그 분석

4559 단어 logsawscloudwatchjava

소개



Cloudwatch 로그는 Cloudwatch라는 기치 아래 AWS에서 제공하는 서비스 중 하나입니다. 이름에서 알 수 있듯이 로그를 모니터링하고 저장하는 데 사용됩니다. 이러한 로그는 ECS, Lambda, 배치 작업(일반적으로 EC2) 등과 같은 다양한 서비스/리소스에서 생성될 수 있습니다. 이 게시물에서는 Cloudwatch 로그의 구조와 이러한 로그를 가져오기 위한 몇 가지 코드 샘플을 살펴보겠습니다.

해부



서비스와 관련된 3가지 주요 용어가 있습니다.
  • 로그 그룹 : 사용자 가이드는 로그 그룹을 다음과 같이 정의합니다. 로그 그룹은 동일한 보존, 모니터링 및 액세스 제어 설정을 공유하는 로그 스트림 그룹입니다. 쉽게 이해하기 위해 로그 그룹을 모든 그룹의 모음으로 생각할 수도 있습니다.
    특정 서비스에 속하는 로그. 예를 들어 ecs 서비스용 로그 그룹, 람다용 로그 그룹 등을 가질 수 있습니다. 대부분의 경우 AWS는 기본적으로 로그 그룹을 생성합니다.
  • 로그 스트림 : 로그 스트림은 동일한 소스에서 오는 일련의 로그 이벤트(아래에 정의됨)입니다. 예를 들어 람다 실행을 생각해 보십시오. 람다의 전체 실행으로 생성된 모든 로그는 하나의 로그 스트림으로 끝납니다.
    마찬가지로 배치 작업의 전체 실행으로 생성된 모든 로그도 하나의 로그 스트림으로 끝납니다.
  • 로그 이벤트: 모든 단일 로깅, 모든 Logger.info() , 모든 System.out.println() , 모든 print() 하나의 로그 이벤트를 구성합니다. 로그 이벤트에는 3가지 속성이 있습니다.
    a) 메시지(실제 메시지)
    b) 타임스탬프(메시지가 생성된 시점)
    c) 수집 타임스탬프(메시지가 CloudWatch에 수집된 시점)

  • 다음 이미지는 로그 그룹, 로그 스트림 및 로그 이벤트 간의 관계를 보여줍니다.



    자바 SDK 사용



    이 부분에서는 특정 로그 스트림에서 모든 로그를 검색하는 방법을 살펴보겠습니다. 예를 들어 람다 오류 발생 시 일부 로그 처리를 자동화하려는 경우에 유용할 수 있습니다.
  • 메이븐 종속성
    (언급된 버전 언급자는 상징적인 목적을 위한 것이므로 최신 버전 또는 기존 종속성과 호환되는 버전을 선택해야 합니다.)

  •     <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk-logs</artifactId>
                <version>1.11.519</version>
            </dependency>
    


  • A 로그 클라이언트 만들기(기본값)

  • AWSLogs logsClient = AWSLogsClientBuilder.defaultClient();
    


  • 로그 검색
    먼저 요청 객체를 생성해야 합니다. 시작하려면 로그 그룹 이름과 로그 스트림 이름을 전달합니다.

  • GetLogEventsRequest logEventsRequest = new GetLogEventsRequest(logGroupName, logStreamName)
    


    이제 위에서 만든 클라이언트를 사용하여 로그를 가져올 수 있습니다.

    GetLogEventsResult logEventsResult = logsClient.getLogEvents(logEventsRequest);
    


    GetLogEventResult에는 다음 정보가 포함되어 있습니다.
  • 로그 이벤트 목록 List<OutputLogEvents>
  • 다음 전달 토큰
  • 다음 역방향 토큰

  • 토큰은 어떻게 되나요? 로그 이벤트를 가져오기 위해 호출하면 결과에 모든 로그가 포함되지 않을 수 있습니다. 1MB(로그 이벤트 10,000개)로 제한됩니다. 특정 로그 스트림에 더 이상 로그가 기록되지 않는 경우 다음 역방향 토큰을 사용하여 가져와야 하는 오래된 로그 이벤트가 대부분 있을 것입니다. 로그 스트림에 새 로그 이벤트가 있는 경우 다음 전달 토큰을 사용하면 더 많은 로그 이벤트가 생성됩니다. 그런 경우, 우리가 얻은 첫 번째 결과가 우리를 로그의 한가운데에 놓고 완전한 그림을 얻기 위해 앞뒤로 이동해야 한다고 가정하는 것이 좋습니다.

    토큰을 사용하여 더 많은 로그를 가져오는 시각적 표현



    반복적으로 또는 재귀적으로 이 작업을 수행할 수 있습니다. 다음은 토큰을 반복적으로 사용하기 위한 코드 샘플입니다.

            List<OutputLogEvent> outputLogEvents = new LinkedList<>();
            GetLogEventsResult eventsResult = new GetLogEventsResult();
    
            String nextToken = token;
    
            do{
                logEventsRequest.setNextToken(nextToken);
                eventsResult = logsClient.getLogEvents(logEventsRequest);
                outputLogEvents.addAll(eventsResult.getEvents());
    
                nextToken = tokenDirection.equals(TOKEN_DIRECTION.BACKWARD) ? eventsResult.getNextBackwardToken() 
                        : eventsResult.getNextForwardToken();
    
                LOGGER.info("Next Token: " + nextToken);
    
            }while (CollectionUtils.isNotEmpty(eventsResult.getEvents()));
    
    


    순회하는 동안 시퀀스에 대해 주의를 기울이거나 모든 이벤트를 가져오고 다음을 사용하여 정렬할 수 있습니다.
    타임 스탬프.

        outputLogEvents
                    .stream()
                    .sorted(Comparator.comparing(OutputLogEvent::getTimestamp))
                    .collect(Collectors.toList());
    


    이것으로 기사는 끝납니다.
    건배!

    추가 읽기 및 참조 사용



    a-Cloudwatch Logs USer Guide
    b- SDK Javadoc

    좋은 웹페이지 즐겨찾기