Cloud Watch로 로그 수집하기

이성준·2023년 2월 10일
0

프로젝트

목록 보기
5/5

문제

로그확인할때 ec2에 직접들어가서 로그파일을 열고 확인하는 작업이 너무 번거롭다

Cloud Watch

로그 수집용으로 쓸게 뭐가 있나 찾아봤는데 사람들이 많이 쓰는 게 보통 ELK(ElasticSearch LogStash Kibana)와 CloudWatch인거 같았다. ELK보다는 적용하기 훨씬 쉽고 레퍼런스도 많은 CloudWatch를 적용하기로 했다.

적용하는 방법 자체는 매우 쉬웠다.
1. 먼저 CloudWatchFullAccess를 받은 IAM계정을 만든다.
2. LogBack을 설정해준다. -> logback-awslogs-appender이라는 라이브러리를 사용하면 쉽게 설정할 수 있다.

gradle

implementation "ca.pjer:logback-awslogs-appender:1.6.0"

먼저 의존성을 추가해준다.

logback-spring.xml


<?xml version="1.0" encoding="UTF-8"?>
<configuration packagingData="true">
    
    <springProperty name="AWS_ACCESS_KEY" source="cloud.aws.credentials.access-key"/>
    <springProperty name="AWS_SECRET_KEY" source="cloud.aws.credentials.secret-key"/>
    
    <timestamp key="timestamp" datePattern="yyyy-MM-dd-HH-mm-ssSSS"/>
    <appender name="aws_cloud_watch_log" class="ca.pjer.logback.AwsLogsAppender">
        <layout>
            <pattern>[%thread] [%date] [%level] [%file:%line] - %msg%n</pattern>
        </layout>
        <logGroupName>dongnebook-</logGroupName>
        <logStreamUuidPrefix>dongnebook-</logStreamUuidPrefix>
        <logRegion>ap-northeast-2</logRegion>
        <maxBatchLogEvents>50</maxBatchLogEvents>
        <maxFlushTimeMillis>30000</maxFlushTimeMillis>
        <maxBlockTimeMillis>5000</maxBlockTimeMillis>
        <retentionTimeDays>0</retentionTimeDays>
        <accessKeyId>${AWS_ACCESS_KEY}</accessKeyId>
        <secretAccessKey>${AWS_SECRET_KEY}</secretAccessKey>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>

    </appender>



    <appender name="application_log" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%thread] [%date] [%level] [%file:%line] - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <springProfile name="local">
            <appender-ref ref="application_log"/>
<!--            <appender-ref ref="aws_cloud_watch_log"/>-->
        </springProfile>
    </root>
    <root level="WARN">
        <springProfile name="rds">
            <appender-ref ref="application_log"/>
            <appender-ref ref="aws_cloud_watch_log"/>
        </springProfile>
    </root>

</configuration>

logGroupName : Cloud Watch에서 묶이는 그룹이름
logStreamUuidPrefix : 로그스트림에서 접두사로 무엇이 들어갈지 써줌
logregion : AWS 지역명
maxBatchLogEvents : 배치의 최대 이벤트 개수를 설정하는 것이며 1 ~ 10000사이 값만 설정이 가능하다. 이벤트 대기열에 개수가 50개가 되면 AWS Cloud Watch로 로그가 전송됩니다.
maxFlushTimeMillis : 마지막 플러시가 발생한 이후 지정된 시간이 지나면 AWS Cloud Watch로 로그가 전송된다. 0일 경우 로그를 동기로 전송하고 0보다 큰값일 경우 비동기로 로그가 전송됩니다.
maxBlockTimeMillis : 로그가 전송되는 동안 코드가 계속 실행되는 것을 차단하고 값을 0으로 세팅하면 전송중에 발생되는 모든 로그를 버립니다.
retentionTimeDays : 로그 그룹의 보존기간

일단 그렇다고하는데 잘 이해가 가질 않는다. 입맛에 맞게 쓰면 될거같다.

나는 로컬에서는 로깅레벨을 INFO로 설정하고 ec2에 올라간 것은 WARN레벨 이상만 보고싶어서 로깅레벨을 WARN으로 설정했다.

accessKeyId , secretAccessKey 에 iam계정의 액세스키와 시크릿키를 잘 넣어주면 끝이다.

결과


ec2에 연동설정이 끝난 버전을 올리고 Cloud Watch를 확인해보니 로그가 잘 오는 모습을 확인할 수 있었다.

0개의 댓글