우리가 로컬에서 스프링을 구동하면 기본적으로 콘솔에서 쿼리, 요청과 같은 로그들이 출력된다.
실제 프로덕션 환경에서 이를 기록으로 남겨두고 싶다면, 별도의 설정으로 호스트 머신에 보관하고 이를 필요시 읽어야 한다.
로그를 보기 위해 EC2에 접속하고 필요한 날짜의 로그 파일을 여는 건,,, 매우 비효율적이다.
더 나은 방법을 알아보던 중 AWS의 CloudWatch라는 서비스를 알게됐다.
이 서비스를 사용하면 로그를 aws 콘솔에서 편하게 볼 수 있으며, 저장 기간 설정이나 검색같은 기능도 매우 편하게 제공된다.
로그를 바로 CloudWatch로 전송할 수도 있고
로그 파일을 읽어오게끔 할 수도 있다.
그라운드 플립에선 후자의 방법을 선택했다. 과정을 알아보자.
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/groundflip_log.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/groundflip_log.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<springProfile name="local">
<root level="INFO">
<appender-ref ref="ROLLING_FILE"/>
</root>
</springProfile>
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="ROLLING_FILE"/>
</root>
</springProfile>
10일 간 로그를 보관하며 각 날짜마다 logs/groundflip_log.%d{yyyy-MM-dd}.log 와 같은 형식으로 저장되게 된다. 을 사용하여 로그를 남길 방식을 프로필 별로 분리할 수 있다.
“오늘” 날짜에 대한 로그는 groundflip_log.log 파일에 저장되고, 자정에 별도의 파일로 분리된다.
이 설정을 위해선 /src 디렉토리와 같은 위치에 logs 디렉토리를 만들어야한다.
https://gksdudrb922.tistory.com/204
https://velog.io/@jihwankim94/AWS-Cloudwatch-Log-%EB%9E%80
우선 ec2의 iam 역할에 cloudwatch와 관련된 권한을 추가한다.
EC2에 CloudWatch Agent를 설치한다.
// 1. 클라우드 워치 에이전트 다운로드
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
// 2. 클라우드 워치 에이전트 설치
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
// 3. 클라우드 워치와 관련된 설정 파일을 편집한다.
sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json
// 4. 설정 파일을 적용한다.
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
// config.json
{
"agent": {
"run_as_user": "root"
},
"logs" : {
"logs_collected": {
"files": {
"collect_list":[
{
"file_path": "/home/ubuntu/logs/groundflip_log.log",
"log_group_name": "groundflip-dev-log",
"log_stream_name": "dev"
}
]
}
}
}
}
스프링에서 나온 로그가 저장될 파일의 경로와 CloudWatch에서 만든 로그 그룹, 로그 스트림 이름을 적어 넣는다.
그라운드 플립은 현재 도커 컨테이너를 기반으로 구동 중이다.
그렇다면 그라운드 플립의 로그도 컨테이너 내부에 존재하는 logs 디렉토리에 존재하게 된다.
이를 config.json의 file_path와 동기화를 하려면 볼륨 설정이 필요하다.
이를 호스트 머신의 /home/ubuntu/logs 와 동기화 시키기 위해 deploy.sh를 수정한다.
echo "> Run the Docker container"
docker run -d -p 8080:8080 --env-file /home/ubuntu/ground_flip/.env -e TZ=Asia/Seoul -v /home/ubuntu/logs:/logs --name "$APP_NAME" "$APP_NAME"
볼륨이 동기화가 되어 호스트 머신의 logs 디렉토리에 groundflip_log.log가 생성된 것을 볼 수 있다.
로그가 정상적으로 잘 불러와지는 것을 확인할 수 있다.