문제상황
😡 로컬에서 개발을 할 때는 현제 프로젝트의 최상단 디렉터리에 Logback에 의한 로그 파일이 생겼음.
하지만 베포 환경에서는 로그파일이 생성되지 않는 문제점 식별
CD 파이프 라인으로 베포 후 문제 발생
로그가 잘 쌓이나 확인을 해보려고 들어간 찰나.. 폴더는 만들어져 있는데 로그가 안 쌓인다..
환경
- AWS
- EC2(Ubuntu 22.04)
- Docker compose 사용
문제인지 과정
1) SSH로 베포 중이 EC2인스턴스(Ubuntu)에 접근
2) 도커 컴포즈 빌드
docker-compose build --no-cache
3) 도커 컴포즈 실행
docker-compose up -d
4) exec사용하여 백엔드 컨테이너에 접근(알파인 리눅스)
docker exec -it <컨테이너 이름> /bin/sh
5) 접근 후 경로 확인
😡 어 폴더가 생긴 거 보니까 잘 돌아는 가는 거 같은데, 안네가 다 비어있네..?
실패한 조치사항들
- Logback에 로그가 쌓이는 경로를 알파인 리눅스 상의 절대경로로도 바꿔봄
- 빌드 캐시를 전부 다 지우고 빌드함.
- 버전도 만지작해봄
- 임시이긴 하지만 app/log 폴더의 권한도 777로 다 줘봄
해결책
핑크색으로 박스 쳐놓은 곳에 log라는 폴더가 있다..
눈썰미가 좋았다면 맨 위에서 발견을 하실 수도 있지만, 로컬에서의 구조를 생각을 했기 때문에 루트 디렉터리에 log디렉터리가 눈에 들어오지도 않았다.
로그는 멀쩡히 쌓이고 있었다, 다만 주인장이 삽질을 했을 뿐.
무엇이 문제인가?
클래스 패스에 대한 이해 부족
🔑 /비밀/비밀/Desktop/Backend/src/main/resources/LogBack.xml파일들
경로는 위와 같고 resources안에 있는 Logback 파일 중 일부를 발췌해 왔다.
<file>./log/app/info/yazoba-info-${BY_DATE}.log</file>
이 부분이 로그 파일을 어디에 저장을 할지 정하는 부분인데.
경로의 진입점이./으로 되어있다.
“ “./” 은 상대경로 자나요! resource안에 생기겠네!! “
🔑 스프링 부트의 경우 jar 파일을 실행시킨 위치가 바로 현재 디렉터리의 위치가 된다.
Gradle을 이용해 빌드를 하게 되면 빌드에 필요한 설정파일들을
src/main/resources
에서 읽어오게 된다.
빌드 중에 워킹디렉터리는 프로젝트의 최상단인 루트가 되는 것이다.
그러기 때문에./ 을 쓴다고 src/main/resources 에 로그 파일이 생성이 되는 것이 아니다.
Logback 설정 파일에 정의된 상대 경로(./log/app/info/yazoba-info-${BY_DATE}. log)는 현재 작업 디렉터리를 기준으로 해석.
즉 빌드시점에 Logback의 설정파일에 입장에서./은 프로젝트의 루트기 때문에
이런 구조가 나올 수 있는 것이다.
그럼 왜 /app/log, /log 이렇게 두 개가 생기죠
결론부터 말하면
⭐ 빌드된 이미지를 이미지 저장소에서 받아오는 방법이 아닌, EC2인스턴스에서 CD 파이프 라인이 작동이 될 때 깃허브의 베포브렌치의 코드를 Pull 받아 온 후 이미지를 빌드, 컨테이너에서 jar 파일을 실행하는 과정에서 각 빌드 및 실행시점의 프로젝트 루트가 달라지기 때문에 /log 디렉터리가 두 번 만들어지는 것이다.
문제를 야기 했던 현제 상황들 종합
- 서버를 별도의 이미지 저장소에 올린 후 서버 이미지를 받아서 실행하는 상황은 아님.(추후 도커 허브 및 하버 이용예성)
- CD 파이프라인이 작동이 되면 EC2 인스턴스에서 깃허브 베포브렌치의 코드를 Pull 받은 후 다시 빌드하는 형식임.
위와 같은 이유로 Docker-compose.yml 파일은 아래와 같다
- 서버 쪽 부분만 발췌해 왔는데 현제 경로에 있는 dockerfile로 이미지를 빌드 후 컨테이너를 실행시키겠다는 말이다.
- 현제 EC2 인스턴스에 있는 서버 코드를 도커 컨테이너의 /app 경로에 마운트를 한다고 한다
DockerFile(일부)
Docker-compose up -d
실행이 되면
해당 도커 파일이 실행되게 되는데.
EC2인스턴스에 있는 서버코드를 일단 빌드 후 Jar 파일을 만든다 이 시점에 /log 가 생긴다.
이때 인스턴스 기준의 프로젝트의 루트 /Backend
그다음 컨테이너가 켜지고 jar파일을 컨테이너의 루트에서 실행을 하게 되는데
이 시점에서 프로젝트의 루트는 jar 파일이 실행이 되는 컨테이너의 루트이기 때문에
/log 폴더가 한 번 더 만들어지게 된다.
나는 Chill Guy 이니까.. 괜찮다..
'Yajoba > Backend' 카테고리의 다른 글
[SpringMVC,문제해결] 멀티파트 요청에서 File 타입, DTO 바인딩 문제 ModelAttribute와 RequestPart 차이에서 오는 문제 (0) | 2024.11.30 |
---|---|
MultipartFile 에서 파일 확장자를 검사 해보자. + 멀티파트에서 @Validated가 안되는 현상 (4) | 2024.11.28 |
상품검색 서비스가 언제 확장될지 모른다! 전략패턴(Strategy Pattern)으로 해결해보자 (0) | 2024.11.27 |
팩토리 클래스에 객체 생성에 필요한 서비스를 의존을 받았다. 정답일까 아닐까 (1) | 2024.11.21 |
Data JPA, DTO, Projection 방식중 적합 한 방식은 ? (0) | 2024.10.28 |