Spring

Slack으로 에러 알림 받기

leeheefull 2023. 6. 1. 23:37

현재 제가 담당하고 있는 팀 프로젝트에서 발생하는 에러를 효과적으로 처리하고, 팀원들이 이를 실시간으로 확인할 수 있도록 개선하고자 합니다.

간단하게 Slack webhook API를 활용하여 이를 해결해보려고 합니다.

 

Slack webhook URL 생성하기

구현하기 전에 이미 slack workspace가 있다고 가정하고 설명하도록 하겠습니다. slack webhook을 생성하기 위해서는 아래와 같이 https://api.slack.com/apps 페이지에 접속해야 합니다.

webhook를 생성하기 위해서는 app을 생성해야 합니다. “Create New App”를 클릭합니다.

“From scratch”를 클릭합니다.

그리고 생성할 “App Name”을 적어줍니다. 이는 알람을 보내는 주체가 됩니다. 다음으로는 어떤 workspace에 app을 생성할지 골라줍니다.

이렇게 “Alarm”이라는 app이 생성됐고 이는 “leeheefull”이라는 workspace에 알람을 보낼 수 있게 됩니다.

이제 해당 app의 webhook를 생성하도록 하겠습니다. “Incoming Webhook”를 클릭합니다.

“Activate Incoming Webhooks”를 “on”으로 바꿔줍니다.

“Add New Webhook to Workspace”를 클릭합니다.

마지막으로 알람을 보낼 채팅방을 선택하고 허용을 눌러주면 끝이 납니다.

 

Service vs Logback

Slack 메시지를 보내는 데에는 두 가지 방법이 있다고 생각했습니다. 첫 번째는 서비스 로직 내에서 특정 지점에서 알림을 보내는 방법이며, 두 번째는 logback에서 에러 레벨을 확인하고 해당 메시지를 자동으로 전송하는 방법입니다. 저는 두 번째 방법을 선택하여 구현하게 되었습니다.

이유는 아래와 같습니다.

  1. 자동화와 효율성: 이 방법을 사용하면 개발자가 직접 알림을 보낼 필요가 없습니다. 에러가 발생하면 시스템이 자동으로 Slack에 알림을 보내므로 신속한 대응이 가능합니다.
  2. 즉각적인 에러 감지: 서비스 로직에서 알림을 보내는 방법은 특정 지점에서만 알림이 발생하므로 모든 에러를 감지하기 어렵습니다. 그러나 logback에서 에러 레벨을 모니터링하면 발생한 모든 에러에 대한 알림을 받을 수 있습니다.
  3. 유연성: logback은 로깅 라이브러리로 다양한 설정과 필터링 옵션을 제공합니다. 따라서 어떤 종류의 에러에 대한 알림을 받을지를 정교하게 조절할 수 있습니다.
  4. 로그 기록: Slack으로 메시지를 전송하는 동시에 logback은 에러를 기록합니다. 이는 나중에 디버깅이나 문제 해결 시에 유용합니다.
  5. 간편한 구현: 이미 logback을 사용하고 있다면, 추가적인 구현이나 외부 서비스 도입 없이 상대적으로 간단하게 Slack으로 에러 알림을 설정할 수 있습니다.

그렇다면, 이제 프로젝트에 적용해 보겠습니다.

 

Logback Slack Appender 적용하기

직접 Logback Appender와 관련된 인터페이스를 구현해도 되지만, 간단하게 라이브러리를 사용하도록 하겠습니다. 아래는 Logback 라이브러리와 Logback slack appender를 사용할 수 있는 라이브러리의 의존성입니다.

implementation("ch.qos.logback:logback-classic:1.4.6")
implementation("com.github.maricn:logback-slack-appender:1.6.1")

그리고 이제 logback-spring.xml을 작성해야 합니다. 소스 코드는 아래와 같습니다. 간단한 설명을 주석으로 작성해 보았습니다. 에러 알림 템플릿 패턴은 간단하게 Kibana Log처럼 해보았습니다.

 

위의 코드 상단에는 springProperty가 있습니다. 이는 webhook url과 관련된 정보입니다. 이를 application.yml에 아래와 같이 적어줍니다.

이렇게 하면, logback 적용되어 에러 로그를 찍을 경우에 알람이 전송될 수 있게 됩니다.

 

Logback Slack Appender Test Code 작성하기

위에서 적용한 logback이 정상 동작하는지 테스트 코드를 작성하여 확인해보려고 합니다.

위는 java.lang.ArrayIndexOutOfBoundsException를 발생시키려고 의도적으로 작성했습니다. 예외가 발생하면 catch 하여, 에러 로그를 찍으면 아래처럼 메시지를 받게 됩니다.

이처럼 간단하게 라이브러리를 사용해도 되지만, 당연하게도 직접 Custom 할 수도 있습니다. 한 번 해보겠습니다.

 

Custom Logback Appender 구현하기

아래 사진처럼 logback.xml에 있는 태그들은 구현체 클래스를 기반으로 동작합니다. 우리가 자주 사용하는 ch.qos.logback 라이브러리도 의존성 주입을 받아 사용하고 있지만, 직접 구현할 수도 있습니다.

위처럼 수정해 주고 해당 위치에 아래처럼 CustomLogbackSlackFilter를 구현합니다.

위처럼 logback 라이브러리를 보다 보면, ILoggingEvent가 자주 등장하는데, 이 인터페이스는 로그 이벤트에 대한 정보를 제공하는 메서드들을 정의하고 있습니다. 주로 logback 내부에서 로그 이벤트를 생성하고 전달하는 데 사용됩니다. 이를 활용하면, 원하는 Custom 한 logback 설정을 할 수 있습니다.

하지만, 저희 팀은 Common 서버나 Nexus와 같은 것들을 지양하고 있습니다. 그래서 위와 같이 커스텀하면 각 서버마다 Slack 관련 Appender 또는 Filter 클래스를 추가해 주어야 하는 불편함이 있기 때문에, 저는 라이브러리를 사용하게 되었습니다.

 

Reference

 

이상입니다. 궁금한 점과 이상한 점이 있다면 편하게 문의하시면 감사하겠습니다. 글과 관련해서 구현한 코드는 여기에 있습니다.