본문 바로가기

Server/Spring

[Spring] 스프링에서 Slack에 에러 로그 보내기

반응형
SMALL

 

글을 시작하기 전에

자잘한 프로젝트까지 포함하여 2년 간 총 7번의 사이드 프로젝트를 경험하며 느낀 점 중 하나.. 로그 관리는 매우 중요하다. 특히 에러 로그!

물론 에러가 발생한 상황이야 직접 서버를 들어가 확인할 수도 있고, 에러가 발생했던 시나리오와 똑같이 재현해서 알아낼 수도 있다. 하지만 리소스가 너무너무 많이 들었다.. 최근 2주동안 초기 MVP 규모의 서비스 REST API를 빠르게 구현해야 할 일이 있었다. 이번에는 에러 로그를 수집해서 바로 대응할 수 있도록 하자. 하지만 트레이드 오프를 고려해서 가장 빠르게 설정할 수 있는 방법으로 선택하자. 라는 결론을 내리게 되었다.

 


Slack 설정 및 연동

진행한 프로젝트는 Slack 서비스를 활용했다. 가장 빠르게 접근할 수 있는 협업 툴이었으므로, Slack 내 채널에 에러 로그를 연동해서 수집하기로 했다. 그럼 Slack 서비스를 설정해보자. 에러 로그를 수집할 채널과, Incomming Webhook API를 추가하면 된다.

 

에러 로그를 수집할 채널의 설정에서 앱의 앱 추가로 들어가준다.

 

그럼 여러 앱을 검색할 수 있는데, 우리는 Incomming WebHooks를 설치할 것이다. 위 이미지에는 이미 추가가 되어있으니 참고하자.

설치 버튼을 누르면 관련 웹 사이트로 이동될텐데, 거기서 Slack 추가 버튼을 선택해주면 된다.

 

추가를 선택하면 다음 페이지로 넘어가는데, 아래로 쭉 내리면 위 이미지와 같다. 로그를 수집할 채널을 선택하고, 바로 아래 버튼(수신 웹후크 통합 앱추가)을 눌러주면 된다.

 

마지막으로 버튼을 눌러주게 되면, 웹 후크 URL을 받을 수 있을 것이다. private한 공간에 잘 저장해두자.

 


Spring 설정

그럼 이제 프레임워크로 넘어와서 추가적이 설정을 이어가보자.

 

    // slack logback
    implementation 'com.github.maricn:logback-slack-appender:1.4.0'

먼저 위 의존성을 추가해주자. 파일은 당연히 build.gradle이다.

 

logging:
  slack:
    webhook_url: ${SLACK.WEBHOOK_URL.dev}
    config: classpath:logback-spring.xml

그리고 설정 파일(application.yml)에 webhooks를 추가하며 받은 URLlogback 파일 위치를 추가해주자.

url은 private한 설정 파일에 기재하여 import 해주었고, logback 파일은 main/resources/logback-spring.xml 파일로 추가해주었다.

url은 노출되지 않도록 주의하자.

 

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <springProperty name="SLACK_WEBHOOK_URI" source="logging.slack.webhook_url"/>
    <appender name="SLACK" class="com.github.maricn.logback.SlackAppender">
        <webhookUri>${SLACK_WEBHOOK_URI}</webhookUri>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</pattern>
        </layout>
        <username>Dev-Server-log</username>
        <iconEmoji>:stuck_out_tongue_winking_eye:</iconEmoji>
        <colorCoding>true</colorCoding>
    </appender>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d %-5level %logger{35} - %msg%n</Pattern>
        </encoder>
    </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="INFO">
        <appender-ref ref="Console" />
        <appender-ref ref="ASYNC_SLACK"/>
    </root>
</configuration>

(위치: src/main/resources/logback-spring.xml) logback-spring.xml 파일을 추가한다.

WebHooks URL은 설정 파일에서 추가해준대로 property에 적어주면 된다. 그 외에 username을 정할 수 있고, 이모지도 정할 수 있다. 다양한 커스텀을 시도해보고 싶으면 logback-slack-appender 레포지토리를 참고하도록 하자.

 

@Sl4j 등을 사용하여 log.error를 찍어주기만 하면 Slack 채널에서 에러 로그가 잘 수집될 것이다 :)

 


테스트

대충 dev 환경으로 실행시켜, 테스트용으로 에러 하나 던져주면 Slack 채널에서 잘 수집되는 것을 확인할 수 있었다!

 


추가로 생각해볼 것

추가로 찾아보니, xml 파일 말고도 코드로도 Appender를 구현할 수 있는 것 같았다.

물론 작은 프로젝트에서는 xml 설정이 더 간편하게 적용되기 때문에 아무거나 사용해도 상관없지만 (당시 오히려 개발 리소스를 줄이는 방식으로 xml 방식을 우선 선택함), 프로젝트가 좀 더 복잡해짐에 따라 확장성 측면에서 Appender 구현 방식을 선택하는 것이 더 효율적인 접근일 수 있다고 생각한다. 현재 해당 프로젝트는 다음 스프린트 재조정 중에 있는데, 요새는 테스트 코드를 작성해보고 있다. 테스트 코드 마무리하고, 스프린트 본격적으로 들어가기 전에 구현해볼까 한다 :)

 

전지전능하신 GPT님께서도 말씀해주셨다 :D 에러 로그를 여러 방면으로 수집할 가능성이 있다면 Appender를 직접 구현하는 것이 더 유리할 수 있을 것 같다. 후에 Appender를 직접 구현한 후, 해당 블로그에 내용을 추가하도록 하겠다. 🙌

 


References

https://velog.io/@banjjoknim/Spring-Boot%EC%97%90%EC%84%9C-Logback%EC%9C%BC%EB%A1%9C-slack%EC%97%90-%EC%97%90%EB%9F%AC-%EB%A1%9C%EA%B7%B8-%EB%82%A8%EA%B8%B0%EB%8A%94-%EB%B0%A9%EB%B2%95

https://github.com/maricn/logback-slack-appender

https://be-student.tistory.com/90

https://suho0303.tistory.com/58

반응형
LIST