본문 바로가기
Spring

스프링에서 실시간 에러 로그를 Discord로 받는 방법

by 이숴 2023. 12. 10.
반응형

https://suho0303.tistory.com/58

 

스프링부트에서 실시간 에러 로그를 Slack으로 받는 방법

플랫폼을 운영하면서 실시간으로 발생하는 에러를 빠르게 캐치하고 대응하려면 개발자에게 빠르게 그 사실을 알려야합니다. 그래서 일반적으로 슬랙이나 디스코드와 같은 플랫폼으로 알림을

suho0303.tistory.com

지난 게시물에 이어 Discord로 예외를 감지하는 방법도 한번 공부해보았습니다.

 

Slack과 달리 Discord는 API가 없어서 직접 원하는 채널로 http 요청을 날려야 알림을 받을 수 있습니다.

 

Discord 웹훅봇 생성

먼저 Discord 채널에 웹훅봇을 추가해야합니다.

웹훅 봇 추가

 

봇 만들기

 

웹훅봇이 활동할 채널 선택 후 URL 복사

 

그다음 웹훅봇이 활동할 채널을 선택하고 http 요청을 보낼 웹후크URL 을 가져옵니다.

 

Discord 웹훅 연결

Discord는 각 파라미터에 맞게 요청을 보내야 알림을 받을 수 있기 때문에 각 파라미터 에 맞게 요청을 만들어야합니다.

 

저는 Discord 웹훅 로직과 파라미터를 쉽게 생성 및 관할 수 있는 클래스를 사용하여 파라미터를 관리하였습니다. 이곳에서 각 파라미터를 json에 작성하고 http 요청을 만듭니다. (DiscordUtil)

https://gist.github.com/k3kdude/fba6f6b37594eae3d6f9475330733bdb

 

Java DiscordWebhook class to easily execute Discord Webhooks

Java DiscordWebhook class to easily execute Discord Webhooks - DiscordWebhook.java

gist.github.com

 

위 클래스를 사용하여 DiscordService를 생성했습니다.

@Slf4j
@Component
@RequiredArgsConstructor
public class DiscordService {

    @Value("${webhook.discord.url}")
    private String discordUrl;

    public void sendDiscordAlertLog(CustomException ex, HttpServletRequest request) {
        try {
            DiscordUtil discordUtil = new DiscordUtil(discordUrl);
            String registeredTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

            discordUtil.setUsername("Millicon");
            discordUtil.setAvatarUrl("https://raw.githubusercontent.com/angelSooho/InfraTest/main/images/millicon-black.png");

            DiscordUtil.EmbedObject embedObject = new DiscordUtil.EmbedObject()
                    .setTitle("\uD83D\uDEA8 서버에 에러가 감지되었습니다. 즉시 확인이 필요합니다. \uD83D\uDEA8")
                    .setColor(Color.RED)
//                    .setFooter("여기는 footer 입니다 ", "https://i.imgur.com/Hv0xNBm.jpeg") //  푸터
//                    .setThumbnail("https://i.imgur.com/oBPXx0D.png") //  썸네일 이미지
//                    .setImage("https://i.imgur.com/8nLFCVP.png") //  메인 이미지
                    .addField("Request IP", request.getRemoteAddr(), true)
                    .addField("Request URL", request.getRequestURL() + "   " + request.getMethod(), true)
                    .addField("Error Code", ex.getErrorCode().getStatus().toString(), false)
                    .addField("Error Message", ex.getErrorCode().getMessage(), true)
                    .addField("발생 시간", registeredTimeFormat, false);

            discordUtil.addEmbed(embedObject);
            discordUtil.execute();
        } catch (Exception e) {
            log.debug("Discord 통신 과정에 예외 발생");
        }
    }

}

작성 후, 이전 게시물과 같이 전역 예외 핸들러에 메소드를 추가하시면 알림을 받을 수 있습니다.

 

결과

예외 캐치

 

 

참고

https://gist.github.com/k3kdude/fba6f6b37594eae3d6f9475330733bdb

 

Java DiscordWebhook class to easily execute Discord Webhooks

Java DiscordWebhook class to easily execute Discord Webhooks - DiscordWebhook.java

gist.github.com

https://velog.io/@minu1117/%EC%9E%90%EB%B0%94Spring%EC%9C%BC%EB%A1%9C-Discord-WebHook-%EC%82%AC%EC%9A%A9

 

Java Discord WebHook 사용

팀원들과 프로젝트를 하던도중 서버에서 500 에러 즉, 서버 내 오류가 아닌 예상하지 못한 오류가 발생하면 Discord 에 해당 오류 내용을 프로젝트 팀 Discord 에 오류 로그를 보내는 기능을 구현하기

velog.io

 

반응형

댓글