본문 바로가기
프로젝트/협업 프로젝트(2023.12.18-2024.01.25)

[Key Word 개발기] ec2 스프링부트 에러로그 slack으로 전송

by dal_been 2024. 1. 20.
728x90

우리 팀의 경우 ec2에 배포했는데 로그관련해서는 이렇게 설정해놨다.

(일부분만 보여드린겁니다!)

LOG_DIR=/home/ubuntu/logs
LOG_FILE=$LOG_DIR/keyword.log

# 로그 디렉토리 생성 (없는 경우)
mkdir -p $LOG_DIR

echo "🌈 SpringBoot 애플리케이션을 실행합니다"

JAR_NAME=$(ls | grep .jar | head -n 1)
sudo -E nohup java -jar -Dserver.port=8080 /home/ubuntu/$JAR_NAME >> $LOG_FILE 2>&1 &

 

스크립트가 실행될때 logs폴더안에 keyword.log안에 쌓이도록 해놨다.

 

그러다보니 문제점이...

 

첫번째 에러로그를 일일히 찾아야하는 점...

마치 인텔리제이에서 애플리케이션 띄우듯이 모드 로그가 다 나와서 가독성이 좋지 않았다. 거기다가 ec2 콘솔이 인텔리제이 보다 디자인 자체가 보기좋지가 않아서 힘든 점이 많았다.

 

두번째 로그가 계속 쌓인다...

아무래도 프론트와 연동테스트 중이다 보니 빌드가 하루에도 5번이상을 된다. 근데 로그가 쌓이다보니 마지막 에러로그까지 가는 기다림과 가독성이 좋지 않았다.

물론 가끔식 밑 명령어를 통해 로그를 비워주긴 했지만 그럼에도 가독성자체가 불편한것과 ec2에 매번 접속해야한다는 점이 불편했다.

echo "" > keyword.log

 

 

그래서 찾아보니 slack과 연동이 가능했다

어처피 jenkins build 성공 유무를 슬랙으로 보내고 있어서 스프링부트 로그도 보내면 좋을 것같다는 생각이 들었다.

 

 


슬랙 설정

 

일단 스프링 로그를 슬랙으로 전송하기 위해서는 WebhookUrl을 다운받아야한다.

 

 

각자만든 채널에서 채널이름 클릭하고 통합에 들어가면 앱추가가 있다.

거기서 "incoming WebHooks" 설치 클릭한다.

 

 

위와 같은 설정에서 보낼 채녈을 설정하고 웹후크 url를 복사해둔다.

이후 설정 저장 클릭!

 

 

프로젝트 설정

 

이제 프로젝트 코드로 가자

 

build.gradle

implementation 'com.github.maricn:logback-slack-appender:1.6.1'

 

디펜던시를 추가한다(블로그 올린기준으로 최신)

 

 

application.yml

logging:
  slack:
    webhook-uri: "아까 복사해둔 url"
  config: classpath: logback-spring.xml

 

webhook-uri의 경우 노출되면 안되기때문에 우리팀의 경우 {SLACK_URL}로 적어두고 배포할때 스크립트를 통해 변수를 집어넣었다.

resources 디렉토리 안래에 logback-spring.xml 파일을 만든다.

이후 logback-spring.xml 설정한다.

 

 

logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
   <!-- 1 -->
  <springProperty name="SLACK_WEBHOOK_URI" source="logging.slack.webhook-uri"/>
  <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
    <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</pattern>
    </layout>
    <username>Slack-Server-log</username>
    <iconEmoji>:fire:</iconEmoji>
    <colorCoding>true</colorCoding>
  </appender>

  <!-- 2 -->
  <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <Pattern>%d %-5level %logger{35} - %msg%n</Pattern>
    </encoder>
  </appender>

  <!-- 3 -->
  <appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="SLACK"/>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>ERROR</level>
      <level>WARN</level>
    </filter>
  </appender>

  <!-- 4 -->
  <root level="INFO">
    <appender-ref ref="Console" />
    <appender-ref ref="ASYNC_SLACK"/>
  </root>
</configuration>

 

 

첫번째 코드 부터 설명

  • webhookUri 에는 application.yml등록한 webhookUri가 ${SLACK_WEBHOOK_URL}에 들어간다.
  • pattern의 경우 로그 시간이 뜨게 설정했다
  • username의 경우 slack에 출력되는 이름이다
  • iconEmoji 의 경우 그냥 귀엽게 불로 설정했다. (에러 해결하라는 강조느낌)

두번째 코드 설명

  • 스프링 부트가 실행될때 콘솔 로그가 출력되도록 설정

세번째 코드 설명

  • ERROR나 WARN로그의 경우 슬랙으로 알림보내도록 설정

네번째 코드

  • 간단하게 INFO레벨이상의 로그만을 콘솔에 출력하면서 슬랙에 비동기적으로 로그를 전달하겠다는 말이다

 


다만 이 방식은 큰 단점이 있다. webhookuri는 내가 만약 해당 슬랙에서 탈퇴하게 되면 저 기능은 못쓰게 된다. 왜냐면 내가 설정한 것이라서... 못쓰게 된다... 일단 협업프로젝트이고 빠르게 에러로그를 간단하게 볼 수 있는 방법 구축을 위해 저방법을 썼다!

 

 

 

 

https://devlog-wjdrbs96.tistory.com/327