Spring Slack 에러 모니터링

흐핫·2022년 10월 11일
0

spring

목록 보기
1/1

Spring의 에러로그를 Slack으로 모니터링 해보자.

배경

방법

build.gradle 의존성 추가

    implementation 'com.github.maricn:logback-slack-appender:1.6.1'
    implementation group: 'eu.bitwalker', name: 'UserAgentUtils', version: '1.17'
    implementation 'net.gpedro.integrations.slack:slack-webhook:1.4.0'

자세한 의존성은 https://mvnrepository.com 통해서 검색바란다.
Maven, Gradle 둘의 의존성 코드를 알 수 있다.

application.yml 설정

log:
  slack:
    enabled: true
    channel: test1
    web-hook-url: https://hooks.slack.com/services/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

  database:
    enabled: true

  level: ERROR

이 설정 값을 yml에 추가 하면 된다. web-hook-url은 slack에 incoming web hook 앱을 추가에서 web-hook-url을 얻을 수 있다.

설정 코드

Slack Error Send 설정 관련 코드는 brant Hwang 분의 코드를 참고 했다.
그대로 코드를 사용해도 좋다. 나도 그렇게 했다 ㅎ..
https://medium.com/chequer/springboot-slack-logback%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%97%90%EB%9F%AC-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-7f231812d3fc

[출처] https://github.com/brant-hwang/spring-logback-slack-notification-example

LogBack.xml

Slack에서 에러 로그를 전송해줄 xml파일이 추가되어야한다.

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

    <springProperty name="SLACK_WEBHOOK_URI" source="logging.slack.webhook-uri"/>
    <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
        <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
        <channel>#refill_attlasian</channel>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
        </layout>
        <username>${HOSTNAME}</username>
        <iconEmoji>:stuck_out_tongue_winking_eye:</iconEmoji>
        <colorCoding>true</colorCoding>
    </appender>

    <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>
        </filter>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC_SLACK" />
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

[출처] : https://code-mania.tistory.com/m/146

결과

에러 로그를 전송할 때, 임의로 에러를 낼 필요가 있는데, Controller를 구현해서 임의로 에러를 발생시켜봤다.

package com.junyharang.springinitproject.controller.slack;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SlackLoggerController {

    @PostMapping("/api/v1/test")
    public String responseFailV1(@RequestParam(required = false) String value1,
                                 @RequestParam(required = false) String value2) {
        if(value1 == null || value1.equals("")) {

            throw new IllegalArgumentException("value is null!!");
        }
        return "fail!!";
    }
}

value1값이 없으면 IllegalArgumentException이 예외로 throw 돼서 예외 로그가 터진다.
이를 확인하기 위해 Post Man을 활용해서 했더니,,, Browser가 감지가 안돼서 NullPointerException이 터지는데,, 당황하지 말자

이런 오류가 발생한다. 이것은 데스크탑 앱으로 Request 전송을 했기 때문에 이러한 현상이 뜬거고, 이것을 잘 파악을 하지 못해서 꽤 고전했다.

해결하는 방법은 브라우저에서 JS로 스크립트를 짜서 보내는 방법이 있는데, 이건 추천하지 않는다. CORS(Cross-Origin Resourse Sharing) 때문에.. 귀찮다. CORS의 기본 개념은 내가 정리해두었으니 참고 바란다.

그래서 Talend API 크롬 확장 앱으로 Request를 하는것이 바람직하다. Browser 정보도 담기고, NullPointerException이 터지질 않는다.


Content-Type은 Parameter로 전송할거기 때문에 application/json으로 하지 말고, application/x-www-from-urlencoded로 헤더를 전송해야한다.

이것으로 전송을 했고,,

결과는 잘 나온다. 이것으로 Spring Error Log를 Slack으로 전송하는 방법에 대해서 알아보았다.


혹시 Client IP를 명시하고 싶으면, 다음과 같이 하면 된다.
우선 난 시나리오를 생각했다.
1. AWS에 spring jar 전송
2. AWS에 NGINX 설치
3. 로컬에서 AWS로 HTTP Request 하기

이런식으로 진행했고, 잘되었다.

profile
swaegr253@naver.com

0개의 댓글