본문 바로가기

Discord webHook

디스코드 웹훅 이용하여 스프링부트 서버로그 알림받기 ( 2 )

반응형

Git Actions를 이용해 CI/CD 구현 및 쉘 스크립트 이름.sh이후 진행사항

 

디스코드 웹훅을 이용한 스프링 서버 로그 에러 검출 및 자동화 구현

스프링 서버에서 발생하는 오류 로그를 디스코드 웹훅을 통해 자동으로 알림을 보내는 시스템을 구축할 것 입니다.

이 시스템은 대몬 프로세스와 타이머를 사용하여 일정 주기마다 로그를 검토하고, 에러가 발견될 경우 해당 에러 로그의 처음부터 500자까지를 디스코드 채널로 전송합니다.

 

구현 단계

  1. 디스코드 웹훅 설정
  2. 스프링 서버 로그 설정
  3. 로그 검출 및 알림 코드 작성
  4. 대몬 프로세스 및 타이머 설정

 

1. 디스코드 웹훅 설정

먼저, 디스코드 채널에서 웹훅 URL을 생성해야 합니다.

 

1.디스코드 서버 설정으로 이동.

서버 로그를 받을 채팅 채널을 개설하고

개설한 채팅 채널에서 설정을 누르면

위와 같은 사진과 같은 화면이 뜨게됩니다.

 

이후 좌측 메뉴에서 연동 -> 새 웹후크 를 누를시

웹 훅이 생성됩니다.

 

생성된 웹후크를 눌러  이름 및 알림이 뿌려질 채널이 맞는지 설정을 해준뒤 

웹후크 URL 복사를 눌러 링크를 복사합니다.

 

 

2. 스프링 로그 출력 레벨 설정 ( yml 파일 )

스프링부트 프로젝트 src/main/resources/  **.yml, **.properties 파일속 

logging:
  level:
    root: INFO
    org.springframework.web: DEBUG
    org.springframework.security: ERROR

해당 코드 추가후 저장

 

 

3. 로그 검출 및 디스코드로 알림 전송 스크립트

경로 : /usr/local/bin/send_logs_to_discord.sh

 

작성하기전 sudo apt-get install jq 설치하기 ( 리눅스 명령어(쉘) 에서 JSON형 데이터를 처리할수있는 유틸리티 )

#!/bin/bash

# Discord 웹훅 URL
WEBHOOK_URL="1번에서 복사한 디스코드 Web Hook URL 주소"

# 마지막으로 확인한 로그의 타임스탬프를 기록할 파일
LAST_TIMESTAMP_FILE="/home/ubuntu/로그/last_timestamp"

# 마지막으로 확인한 타임스탬프가 저장된 파일이 존재하지 않으면 생성
if [ ! -f "$LAST_TIMESTAMP_FILE" ]; then
    echo "1970-01-01 00:00:00" > "$LAST_TIMESTAMP_FILE"
fi

# 마지막으로 확인한 타임스탬프 불러오기
LAST_TIMESTAMP=$(cat "$LAST_TIMESTAMP_FILE")

# danum.service 로그에서 마지막 타임스탬프 이후의 새로운 DEBUG 메시지 중 POST, GET 메시지 찾기
LOGS=$(journalctl -u danum.service --since "$LAST_TIMESTAMP" | awk 'BEGIN{ LANG="en_US.UTF-8"; OFS="\n"; RS="" } /DEBUG/ && (/POST/ || /GET/){print substr($0, index($0, "DEBUG"), 1999)}')

# 새로운 DEBUG 로그가 있을 경우
if [ ! -z "$LOGS" ]; then
    # 메시지의 시작과 끝에 구분선을 추가
    FORMATTED_LOGS="------------------------------------------------------------------------------------------------------\n$LOGS\n------------------------------------------------------------------------------------------------------"

    # jq를 사용하여 JSON 문자열로 변환
    MESSAGE=$(echo -e "$FORMATTED_LOGS" | jq -Rs .)

    # Discord로 전송
    curl -H "Content-Type: application/json" \
         -d "{\"content\": $MESSAGE}" \
         "$WEBHOOK_URL"
fi

# 마지막으로 확인한 타임스탬프 업데이트
date "+%Y-%m-%d %H:%M:%S" > "$LAST_TIMESTAMP_FILE"

 

위 스크립트는 다음과 같은 작업을 수행합니다.

  1. 마지막으로 확인한 로그의 타임스탬프를 기록한 파일이 없으면 생성합니다.
  2. journalctl을 사용하여 마지막 확인 이후의 로그를 검색합니다.
  3. 검색된 로그 중 DEBUG 메시지와 POST, GET 메시지를 포함하는 줄을 추출합니다.
  4. 추출된 로그가 있으면 디스코드 웹훅을 통해 전송합니다.
  5. 마지막으로 확인한 타임스탬프를 업데이트합니다

 

4. 시스템 서비스 설정

이 스크립트를 주기적으로 실행하기 위해 시스템 서비스를 설정합니다. 먼저 서비스 파일을 생성합니다.

/etc/systemd/system/send-logs-to-discord.service 파일을 생성하고 다음 내용을 추가합니다

 

[Unit]
Description=Send logs to Discord

[Service]
Type=oneshot
ExecStart=/usr/local/bin/send_logs_to_discord.sh

 

 

5. 타이머 파일

타이머 파일을 생성하여 주기적으로 서비스를 실행하도록 설정합니다.

/etc/systemd/system/send-logs-to-discord.timer 파일을 생성하고 다음 내용을 추가합니다:

 

[Unit]
Description=Run send-logs-to-discord.service every 1 minutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

이 타이머는 시스템 부팅 후 1분 후에 시작되며, 이후 매 1분마다 스크립트를 실행합니다.

 

6. 서비스 및 타이머 활성화

다음 명령어를 사용하여 서비스와 타이머를 활성화하고 시작합니다

sudo systemctl daemon-reload
sudo systemctl enable send-logs-to-discord.service
sudo systemctl enable send-logs-to-discord.timer
sudo systemctl start send-logs-to-discord.timer

 

 

이후 자체적으로 오류 발생시켜 디스코드 채팅 채널에 로그가 오는지 확인하기

 

반응형