서버 로그 설정

이성우·2024년 9월 2일
0

Project

목록 보기
8/8

최근에 오류가 발생했는데, 로그를 볼 수가 없었다 하하...
우리 팀원들이 현재 서버의 로그를 보려면
1. AWS 콘솔 접속
2. Bastion Host 접속
3. Bastion Host를 통해 springboot1, springboot2 서버에 각각 접속
4. 컨테이너 로그를 띄움
5. api를 날리고 로그를 보면서 에러 발생 이유를 찾아봄

참 복잡하다...
그리고 몇몇 분들은 EC2 접근이 안 된다는 피드백도 들어왔다.
그렇기에, Grafana를 통해 간단하게 로그를 볼 수 있게 설정 해야겠다고 생각했다.

찾아보니 promtail, loki 를 사용하는 방법이 있어 그 방식을 사용하기로 했다.

그 전에, 그냥 로그 파일 저장도 안 해두고 있었다 하하...

promtail 설정 이전에 logback을 통해 로그 파일을 저장하기로 했다.

이전에는 application.yml 파일에서 로그 레벨을 설정하고 있었다.
하지만, logback-spring.xml을 사용하는 순간 이 파일에서 로그 레벨을 설정해야 했다.

문제는, 다른 개발자분들이 사용하는 dev와 prod를 구분해야 하는 것이였다.

이유는 간단하다.
나는 prod의 로그만 파일로 저장을 하고 싶은건데,
구분을 하지 않으면 다른 개발자분들이 로컬에서 사용중인 로그들도 같이 저장되기 때문이다.

그래서, xml 파일에 springProfile을 통해서 logback 설정을 분리시켰다.

dev

<springProfile name="dev, test">
    <!-- 콘솔로 로그를 출력하는 STDOUT appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
      </encoder>
    </appender>

    <!-- 루트 로거에서 STDOUT appender만 참조 -->
    <root level="DEBUG">
      <appender-ref ref="STDOUT"/>
    </root>
  </springProfile>

prod

 <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/spring.log</file>
    <!-- 시간 및 크기 기반 로그 롤링 정책 설정 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- 로그 파일의 이름 패턴 설정 (날짜 및 인덱스 포함) -->
      <fileNamePattern>/var/log/%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>

      <!-- 보관할 최대 히스토리 설정 (예: 10일 동안 로그 보관) -->
      <maxHistory>10</maxHistory>

      <!-- 로그 파일의 최대 크기를 설정 (예: 50MB) -->
      <maxFileSize>50MB</maxFileSize>
    </rollingPolicy>

    <!-- 로그 형식 설정 -->
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <!-- 애플리케이션의 기본 로그 레벨 설정 -->
  <root level="INFO">
    <!-- STDOUT appender를 사용하여 로그를 콘솔에 출력 -->
    <appender-ref ref="STDOUT"/>
    <!-- ROLLING appender를 사용하여 로그를 파일에 저장 -->
    <appender-ref ref="ROLLING"/>
  </root>
</springProfile>

이슈가 몇 개 있어 history를 10일로 설정했다.
이 이슈에 대해서는 마지막에 얘기할 거다ㅜㅜ

이제, 로그파일도 잘 설정을 했고,
이 파일을 promtail과 연동을 해서 로그를 읽고,
promtail -> loki -> grafana 순으로 로그가 전송되면 된다.

세팅은 생각보다 간단했다.
loki는 그냥 이미지 다운받아서 컨테이너로 띄우면 되는거였고, promtail은 yml 파일을 잘 적어주면 되는거였다

positions:
filename: /tmp/positions.yaml  # Promtail이 마지막으로 읽은 로그 위치를 추적하는 파일

clients:
- url: http://[본인 ip 주소]:3100/loki/api/v1/push  # Loki 서버의 URL

scrape_configs:
- job_name: "springboot-logs"
  static_configs:
    - targets:
        - localhost
      labels:
        job: "springboot1"  # springboot1 인스턴스에서 실행 시
        __path__: /var/log/spring.log  # 로그 파일 경로
    

promtail은 모니터링 서버에 두는것이 아닌, 로그를 수집해야하는것이기에, springboot 서버가 있는 곳에 같이 컨테이너를 띄워줘야한다.
즉, 우리는 springboot1, springboot2가 존재하기 때문에
각각 ec2 인스턴스로 이동한 후에, 해당 ec2 인스턴스에 docker container를 띄워놨다.

주의사항 : 당연히 promtail 컨테이너 띄울 때 springboot 로그파일이랑 volume 연결해야합니다

docker run -d --name=promtail \
  -v /home/ec2-user/promtail/promtail-config.yml:/etc/promtail/promtail-config.yaml \
  -v /home/ec2-user/docker/log/spring.log:/var/log/spring.log \
  grafana/promtail:latest \

무슨말이냐면,
저는 애초에 springboot container 내부의 spring.log랑 EC2 log 폴더랑 볼륨 연결해놓은 상태고,
이 연결되어있는 로그 파일을 promtail이랑 볼륨 연결한겁니다.

되게 설명을 못 하는데 음... 그렇습니다
쨌든 저렇게 연결해서 grafana 데이터 추가할 때 loki 설정하면 grafana에서 로그 시각화 할 수 있습니다.

굿.

아직 해결하지 못 한 문제점.

이전에 로그파일 설정할 때 08:45분만 되면 로그가 끊기는 오류가 발생했다.
컨테이너 내부 들어가서 오류를 확인해보니
이전에는 로그 파일을 하루 단위로 설정해놨었다.
즉, logback을 통해 하루가 지나면,
spring.log 파일을
ex) 2024-09-02.zip 파일로 만든 후에,
새로운 spring.log 파일을 만들고,
이걸 다시 promtail과 연결하는 방식이다.

문제는 zip 파일은 잘 만들어지지만, promtail이 새로운 spring.log 파일을 인식을 잘 못 하는 오류가 발생했다.
즉, spring.log -> 2024.09.02.zip -> spring.log 새롭게 생성
-> 여기서 오류 발생 "promtail이 새로운 spring.log 인식"

이 오류는 아직 고치지 못 했다.
임시방편으로 1일 -> 10일로 수정하고, 10일마다 들어가서 로그파일 지우고 새롭게 컨테이너를 다시 띄우고 있다.
이번주에 이 문제를 해결할 생각이다.
promtail이 spring.log 인식을 못 하는데,
spring container를 다시 띄우면 되지 않을까? 라는 생각을 하고 있긴 하다. (shell script를 사용한다던지...? spring.log zip -> zip으로 변경 + spring.log 새롭게 생성 + 컨테이너 재부팅을 한 묶음으로??)
하루에 한 번씩 컨테이너를 다시 띄우는건 문제가 되니,
10일에 한 번씩 컨테이너를 다시 띄우면 될 것 같긴 한데,
이 방법으로 문제가 해결되면 좋겠당.

profile
이성우

0개의 댓글