Framework & Library/Spring

Spring boot) Discord webhook logback으로 로깅 자동화하기.

ruu++ 2024. 5. 30. 01:05

팀 프로젝트를 진행하면서 Error 로깅을 따로 저장하여 이슈를 확인할 필요성을 느꼈습니다. 그래서 Discord, Slack 중 고민하게 되었는데요. Slack의 경우 무료계정은 90일 동안만 로그가 보관 가능하다고 합니다. 그래서 Discord에 Error 로깅을 남기기로 결정했습니다.

1. 우선 Gradle에 의존성을 추가해야 합니다.

repositories {  
    mavenCentral()  
    maven { url 'https://jitpack.io' }  
}

dependencies {
    implementation "com.github.napstr:logback-discord-appender:${discordWebHookVersion}"
}

2. 다음은 스프링 환경설정입니다.

2 - 1. local 환경과 dev환경 나누기

Resources 폴더에 logback-local.xmllogback-dev.xml 파일을 생성합니다.
개발 환경이 나누는 것이 궁금하시다면 이전에 작성했던 스프링 부트 개발환경 분리하기를 읽어주시기 바랍니다!.

폴더 구조

폴더구조
resources 폴더

logback-dev.xml

mysql dev 환경을 담당하는 logback 파일 입니다.
source 명을 잘 확인해서 application.yml 파일에 명시해야 합니다.
webhook 주소를 제대로 찾지 못하면
http or https 를 찾을 수 없다는 에러가 발생합니다.
level 에서 로깅 레벨을 지정합니다. 에러를 확인하는 용도라서 ERROR로 설정했습니다.

<?xml version="1.0" encoding="UTF-8" ?>  
<configuration>  
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>  
    <!--Discord Log-->  
    <springProperty name="DISCORD_WEBHOOK_URI" source="logging.discord.webhook-uri-dev"/>  
    <appender name="DISCORD" class="com.github.napstr.logback.DiscordAppender">  
        <webhookUri>${DISCORD_WEBHOOK_URI}</webhookUri>  
        <layout class="ch.qos.logback.classic.PatternLayout">  
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{40} [%-5level] %msg %n</pattern>  
        </layout>        <username>Spring-Server-log</username>  
        <avatarUrl>https://img.freepik.com/premium-photo/server-logs-analysis-closeup-developing-programming-and-coding-technologies-developer-working-on-web-sites-codes-in-office_372999-779.jpg</avatarUrl>  
        <tts>false</tts>  
    </appender>  
    <!--Consol appender 설정-->  
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>            <Pattern>[콘솔] %d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</Pattern>  
        </encoder>    </appender>  
    <appender name="ASYNC_DISCORD" class="ch.qos.logback.classic.AsyncAppender">  
        <appender-ref ref="DISCORD" />  
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
            <level>ERROR</level>  
        </filter>    </appender>  
    <!--로그 레벨 지정-->  
    <root level="INFO">  
        <appender-ref ref="Console"/>  
        <appender-ref ref="ASYNC_DISCORD" />  
    </root></configuration>

logback-local.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<configuration>  
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>  
    <!--Discord Log-->  
    <springProperty name="DISCORD_WEBHOOK_URI" source="logging.discord.webhook-uri-local"/>  
    <appender name="DISCORD" class="com.github.napstr.logback.DiscordAppender">  
        <webhookUri>${DISCORD_WEBHOOK_URI}</webhookUri>  
        <layout class="ch.qos.logback.classic.PatternLayout">  
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{40} [%-5level] %msg %n</pattern>  
        </layout>        <username>Spring-Server-log</username>  
        <avatarUrl>https://img.freepik.com/premium-photo/server-logs-analysis-closeup-developing-programming-and-coding-technologies-developer-working-on-web-sites-codes-in-office_372999-779.jpg</avatarUrl>  
        <tts>false</tts>  
    </appender>  
    <!--Consol appender 설정-->  
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>            <Pattern>[콘솔] %d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</Pattern>  
        </encoder>    </appender>  
    <appender name="ASYNC_DISCORD" class="ch.qos.logback.classic.AsyncAppender">  
        <appender-ref ref="DISCORD" />  
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">  
            <level>ERROR</level>  
        </filter>    </appender>  
    <!--로그 레벨 지정-->  
    <root level="INFO">  
        <appender-ref ref="Console"/>  
        <appender-ref ref="ASYNC_DISCORD" />  
    </root></configuration>

Application.yml

Default 설정으로 현재 profiles 값을 설정합니다
local 이라면 logback-local .xml, dev라면 logback-dev.xml 파일을 읽습니다.

logging:  
  config: classpath:logback-${spring.profiles.active}.xml

spring.config.import: classpath:discord.properties

dev 환경인 경우

---  
spring.config.activate.on-profile: dev
...

logging:  
  discord:  
    webhook-uri-dev: ${DISCORD_WEBHOOK_DEV_URL}

local 환경인 경우

---
spring.config.activate.on-profile: local
...

logging:  
  discord:  
    webhook-uri-local: ${DISCORD_WEBHOOK_LOCAL_URL}

discord.properties

웹훅 API 정보는 민감한 정보라서 외부로 노출되면 안됩니다. 별도의 파일로 관리합니다.

DISCORD_WEBHOOK_LOCAL_URL=웹훅 주소명
DISCORD_WEBHOOK_DEV_URL=웹훅주소명

3. DISCORD 서버 만들기 및 설정

이제 디스코드에서 서버를 만들어야 합니다.
+ 버튼을 클릭해서 서버를 생성해줍니다.
직접 만들기, 클럽 커뮤니티, 나와 친구들 아무거나 선택하셔도 됩니다.

서버 만드는 방법입니다!. 버튼을 눌러주세요
Server 만들기

서버 생성 이후

서버를 생성하시면 1번 버튼을 클릭하면 리스트 목록 중 서버 설정을 들어갑니다.
2번의 경우 채팅 채널을 만드는 기능입니다.

웹훅 만들기 위한 서버 설정하기
서버 설정

연동 탭에서 웹후크 만들기

  1. 연동 탭을 클릭합니다.
  2. 새 웹후크를 클릭하면 새로 만들어집니다.
  3. 빨간 글씨 1번을 클릭하시면 URL 복사가 있습니다. 그 내용을 discord.properties에 저장합니다.
  4. 그 이후 log.error()로 에러 메세지가 제대로 연동 되는지 확인 하시면 됩니다!.

디스코드 웹훅 만들기
웹훅 만들기

결과

결과입니다.
결과

긴 글 읽어주셔서 감사합니다!.

참고자료
logback-discordAppender
https://velog.io/@devlyny/Spring-Boot-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%9C%EC%83%9D-%EC%8B%9C-Discord-%EC%95%8C%EB%A6%BC-%EC%84%A4%EC%A0%95