CloudWatch Logs Insights 신입 훈련

새로운 AWS의 CloudWatch Logs Insights를 사용하기 시작한 사람들에게 연습 자료를 제공하는 것이 목표다.

CloudWatch Logs Insights


로그 파일을 감시, 저장 및 액세스할 수 있습니다.
클라우드 감시 로그 Insights 인터랙티브 검색 및 분석 로그 데이터를 사용할 수 있습니다.조회는 조작 문제를 효과적으로 해결할 수 있다.
EC2instance의 Apache access_log와tomcat log를 수집하고 저장하며 AWS 컨트롤러에서 조회 인용과 분석을 할 수 있습니다.

뭐 공부 해요?

  • 각 EC2instance에서 login 없이 로그 참조 가능
  • 로그를 참조할 수 있는 권한으로 로그인하면 로그 참조 이외의 조작도 할 수 있고 다양한 위험
  • 로드 분산, 고가용성, 여러 대의 병렬 구성 시 모든 로그를 원스톱 조사 분석 가능
  • 2대라면 괜찮지만 운용하는 2n대라면 3n대가 싫지?
  • 쿼리가 상당히 강력합니다.
  • 로그의 각 필드를adhoc
  • 로 구조화

    구름 파산 무섭지 않아요?


    네, 요금표.
    https://aws.amazon.com/jp/cloudwatch/pricing/
    무료 사용 범위
    로그 5GB 데이터(아카이브 캡처, 저장, 로그 Insights 검색 데이터)
    양에 따라 요금을 받다
    분석(Logs Insights 쿼리)GB당 스캔 데이터 0.0076달러
    비용 예제
    웹 애플리케이션 액세스 로그 1GB x 30일 = 30GB
    CloudWatch 월 비용 = 12.53달러
    위쪽은 무료 상자의 5GB입니다.너의 시급시간 맞잖아.
    로그 조사는 대부분 최근의 로그만 있으면 이루어지기 때문에 스캔 데이터의 범위를 한정하면 두려워하지 않는다.
    보존 기간 1~10년 선택 가능
    관리자는 조사 가능한 범위와 비용을 저울에 달아 적당한 시간을 유지한다. 컨트롤러의 변형이라면 최근 한 시간은 스캐닝 범위이기 때문에 두려워할 필요가 없다.

    시작 단계

  • AWS 콘솔 로그인
  • CloudWatch > CloudWatch Logs Insights
  • 조사할loggroup(예를 들어homura/tomcat/current)
  • [Run Query]
  • fields @timestamp, @message
    | sort @timestamp desc
    | limit 20
    
    대상 로그 그룹의 최신 로그 20줄을 표시합니다.
    조회는 파이프를 통해 연결되고 간단한 처리를 조립합니다.제이슨이 처리한 제이슨이랑 좀 닮았어요?
    아날로그 SQL로 다시 표현하면 이런 느낌이겠죠.
    SELECT timestamp_, message_ FROM 'homura/tomcat/current'
    ORDER BY timestamp_ DESC
    LIMIT 20;
    
    줄의 상세한 상황을 표시하려면 줄의 을 클릭하십시오.
    ▶ 2 2021-01-23T14:56:02.045+09:00 @40000000600bba7b34e32194 SCIM [HTTP Response Header]:Content-Type=application/scim+json;charset=UTF-8
    
    Field        Value
    @ingestionTime   1611381366827
    @log             <account>:homura/tomcat/current
    @logStream       101a
    @message         @40000000600bba7b34e32194 SCIM [HTTP Response Header]:Content-Type=application/scim+json;charset=UTF-8
    @timestamp       1611381362045
    
    항목에서 사용할 수 있는 모든 패밀리를 봅니다.
    @ingestionTime은 CloudWatch Logs에서 로그 이벤트를 수신한 시간을 나타냅니다.fields는 로그 원본을 표시하는 문자열입니다. 모든 instance의aws-cloudwatch-agent 설정 파일에서 왔습니다.
    설정된 변형은 instance-id이지만 AutoScale을 사용하지 않고 같은 소수의 instance를 사용해온 개발, 시험 환경에서
    instance의pet-name에서 설정한 것도 있겠지.
    두 번째 단계@logstream에서도 추가fields하자.

    SEVERE/ERROR 로그 확인


    500 Internal Server Error 등을 반환했다고 가정하고 로그 조사 연습을 해보십시오.
    fields @timestamp, @logStream, @message
    | filter @message like /(SEVERE|ERROR)/
    | sort @timestamp desc
    | limit 10
    
    찾았어요?
    부합된다면 로그의 검색 범위를 넓혀보세요.초기 값은 과거 1h이므로 3h, 12h입니다.
    다시 보면 Custom에서 4week까지 간단하게 지정할 수 있습니다.

    히트하면 시간축과 히트수의 직사각형도 나오기 때문에 언제부터, 주파수가 얼마인지 금방 파악할 수 있다.
  • 만약에 어떤 배치 이후 첫 번째 용의자
  • 가 이 배치에서의 변경점
  • 정각마다 나오면 무슨 정기집행job인가

  • SEVERE/ERROR 로그 이후의 Stack trace


    Exception이 나왔나봐요.이 Stack trace에서 Exception의 발생 장소를 찾습니다.
    만약 시작점@logStream행이 이렇다면
    @logStream  101b
    @message    @40000000600a66f41b958bdc 22-Jan-2021 05:47:22.461 INFO [ajp-nio-8009-exec-9] com.example.servlet.ScimUsersServlet.httpMethod end(69ms)--->HTTP 500 INTERNAL_SERVER_ERROR
    @timestamp  1611294447291
    
    fields @timestamp, @logStream, @message
    | filter @logStream = "101b"
    | filter @timestamp >= 1611294447291
    | sort @timestamp asc
    | limit 30
    
  • ERROR 행과 같은 logStream(같은 instance)
  • ERRORtimsstamp행에 이어 30행
  • timsstamp의 오름차순 정렬
  • ERROR의 라이브러리나 at javax.의 중간부품이 아닌 개발, 시험 중인 패키지가 나타나면 이 클래스와 줄 번호부터 원본을 조사할 수 있다.
    스태킹 궤적이 너무 길면 at org.apache. 행 수를 조정합니다.

    Export results


    잘 주울 수 있다면 콘솔limit을 사용하세요.여기 마크다운 결과 붙여.
    CSV에서 클립을 다운로드할 수도 있습니다.
    @timestamp
    @logStream
    @message
    2021-01-22 05:47:27.291
    101b
    @40000000600a66f41b958bdc22-Jan-2021 05:47:22.461 정보 [ajp-nio-8009-exec-9]com.example.servlet.ScimUsersServlet.httpMethod end(69ms)--->HTTP 500 INTERNAL_SERVER_ERROR
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748232cff4c at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    2021-01-22 05:48:46.663
    101b
    @40000000600a67482331ae84 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822dc1474 java.lang.NullPointerException
    2021-01-22 05:48:46.663
    101b
    @40000000600a67482336c734 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748233e77f4 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    2021-01-22 05:48:46.663
    101b
    @40000000600a67482343a814 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674823486ebc at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e1f45c at com.example.common.service.mybatis.MybatisUserServiceImpl.getSystemSqlSession(MybatisUserServiceImpl.java:277)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e53c34 at com.example.common.service.mybatis.MybatisUserService3Impl.getUser(MybatisUserService3Impl.java:430)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e9f33c at com.example.common.service.mybatis.MybatisUserService3Impl.getUser(MybatisUserService3Impl.java:422)
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748234d4504 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    2021-01-22 05:48:46.663
    101b
    @40000000600a67482351f43c at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    2021-01-22 05:48:46.663
    101b
    @40000000600a67482356c2b4 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748235da084 at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:486)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674823628284 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748236735a4 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    2021-01-22 05:48:46.663
    101b
    @40000000600a6748236cbbb4 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822f009d4 at com.example.documentservice.servlet.documentmanagerservlet.UserService3.login(UserService3.java:1341)
    조사 Issue에 바로 이 결과를 붙이면 되는 거죠?
    또 슬랙에도 붙이면 Export results 개발 패키지 부분의 단축판만 붙이는 것이 좋다.너무 긴 로그를 붙이면 채널 자체가 읽기 어려워요.
    @timestamp
    @logStream
    @message
    2021-01-22 05:47:27.291
    101b
    @40000000600a66f41b958bdc22-Jan-2021 05:47:22.461 정보 [ajp-nio-8009-exec-9]com.example.servlet.ScimUsersServlet.httpMethod end(69ms)--->HTTP 500 INTERNAL_SERVER_ERROR
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822dc1474 java.lang.NullPointerException
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e1f45c at com.example.common.service.mybatis.MybatisUserServiceImpl.getSystemSqlSession(MybatisUserServiceImpl.java:277)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e53c34 at com.example.common.service.mybatis.MybatisUserService3Impl.getUser(MybatisUserService3Impl.java:430)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822e9f33c at com.example.common.service.mybatis.MybatisUserService3Impl.getUser(MybatisUserService3Impl.java:422)
    2021-01-22 05:48:46.663
    101b
    @40000000600a674822f009d4 at com.example.documentservice.servlet.documentmanagerservlet.UserService3.login(UserService3.java:1341)
    어때?ssh login이 grep, less가 로그 조사를 하는 시대는 아니죠?com.example.* 필드를adhoc로 구조화하는 연습.

    좋은 웹페이지 즐겨찾기