운영중인 서비스의 로그가 보기가 너무 어렵다! - (1)

코린이서현이·2024년 12월 19일
0

백엔드 공부

목록 보기
10/10

로그 보기 너무 힘들어요 (?_⊙)?

현재 상황

배포한 서비스의 에러로그를 보기 위해선 E2C 우분투 서버에 들어가 직접 명령어로 로그를 확인해야했고 다음과 같은 문제가 발생했다.

  1. cmd 창에서 로그를 보다보니 가독성 측면에서 좋지않았다.
  2. 에러 로그를 보기 위해서는 우분투 서버의 주인이 꼭 필요했다!!
    개인적인 생각이지만 어떤 조직에서 누가 없으면 돌아가지 않는다는 것 자체가 위험한 신호라고 생각한다.

따라서 서버에 접속하지 않고도 로그를 확인할 수 있는 방법을 도입하기로 했다.

이런 기능을 도입한다면, 추가적으로 사용자 행동 분석, 보안 모니터링등의 이점을 얻을 수도 있다고 한다!

어떤 로그 모니터링 기술 스택을 선택할까?

먼저 어떤 기술 스택을 사용할지 고민했다.

여러가지 기술이 있었지만 나는 다음의 세가지 조건을 고려했다.

1. 무료일 것
2. 프로젝트 규모에 적합할 것
3. 취업에 의미 있는 기술일 것

지금 배포 준비 중인 서비스는 수익이 나는 구조가 아니고, 이후 수익구조로 바꾸더라도 필요이상의 성능으로 인한 지출은 의미없다고 생각했다.

따라서 2번과 3번의 기준에서 많이 생각해봤고 다음의 두 가지를 고민하게되었다.

EFK Stack

EFK Stack는 Elasticsearch, Fluentd, Kibana의 약자이다.

EFK Stack는 세가지의 기술로 구성되어있다.

  • E: Elasticsearch - 데이터 저장 및 검색 엔진
  • F: Fluentd - 로그 수집기/통합기
  • K: Kibana - 데이터 시각화 및 분석 도구

Elasticsearch는 대규모 데이터 저장/검색에 특화된 검색 엔진이다. 대규모의 로그를 저장해야할 때 유용하다.
Fluentd는 데이터 수집 파이프라인을 구축하는 도구로 다양한 데이터의 수집,전송을 지원한다. 또한 고마운 오픈 소스 플랫폼이다.
Kibana는 Elasticsearch의 데이터를 시각화하는 도구로, 그래프, 차트, 로그 분석 등의 기능을 지원한다.

이런 EFK Stack는 대규모 로그 수집이 필요한 상황에서도 유용하다.
또한 여러개의 서버가 돌아가는 분산환경에도 적합하다. 각 서버에 설치된Fluentd가 중앙서버로 로그를 전송해주기 때문이다.

파일 기반 로깅 + 관리자 페이지

먼저 현재 프로젝트 실행 환경에 대해서 설명하자면,AWS EC2에서 배포되고 있으며, 애플리케이션의 로그는 우분투 서버의 지정된 파일에 저장되고 있다.

로그를 확인할 수 있는 페이지를 보기 위해서 백엔드 서버는 백엔드 서버는 Java의 File API를 사용하여 해당 파일들에 직접 접근하고 내용을 읽어오고 출력할 수 있다.

이런 구조는 외부 api를 사용하지 않고 간단하게 구현할 수 있다는 장점이 있다.

그러나 여러대의 서버가 돌아가는 환경이라면 로그 수집에서 복잡성이 올라갈 수 있고, 실시간성을 보장할 수 없다는 단점도 있다.
또한 만약 그래프나, 여러 분석 UI를 원한다면 구현의 어려움이 생길 수 있다.

과연 나의 선택은?

사실 3번의 기준에서 EFK가 조금 더 끌리지만? 가장 중요한건 프로젝트의 규모라고 생각한다. 어려운 일은 어렵게 쉬운 일은 쉽게!

현재 프로젝트는 분산 환경도 아닐 뿐더러 엘라스틱이 필요한만큼 대규모 로그가 발생하는 환경도 아니다.
또한 Elasticsearch가 많은 메모리르 사용하게 되어 서버 부하가 발생할 수도 있다.

따라서 파일 기반의 로깅 + 관리자 페이지를 구현하기로 결정! (대신 이후 여유가 생기면 꼭 2탄으로 EFK 도입도 다루고 싶다!! )

안 할 수가 없잖아용~

모든 로그를 보는 관리자 페이지를 구현하자

내 계획은 sql, error, info, warn을 모두 필터링해서 볼 수 있게 하는 거였다. 하지만 내맘대로 잘 되지 않아서... 답답한 마음에 계속 미뤄버렸다.!!!
😓😥 완벽하지는 않더라도 하나라도 끝내는 게 성장을 위한 초석아닐까?

그래서 이 글을 여러번에 나눠서 쓰기로 했고 이번 글의 목표는 관리자인증+모든 로그를 그냥 한번에 보기!이다!

관리자 로그인 기능을 구현하자

  1. 관리자용 페이지를 구성한다.
  2. 관리자 페이지의 카카오 로그인 버튼을 누르면, 백엔드의 카카오 로그인 화면 제공 api를 요청하게 된다.
  3. 백엔드는 사용자를 카카오 로그인 화면으로 이동시키면서 카카오에게 특정 api로 코드를 전달받는다.
  4. 백엔드는 카카오 코드를 전달받은 후 해당 코드를 사용해 로그인을 완료시키고, 인증이 완료되고, 사용자가 관라자인 경우(인가)에 로그 페이지로 이동시킨다.

    Oauth 로그인 과정을 더 알아보고 싶다면? 👉 관련 글

(0) 각종 페이지를 제공하는 백엔드 api

@Controller
@RequestMapping("/api/v1/admin/pages")
public class AdminPageController {

    @GetMapping("/log")
    public String getAdminLogPage() {
        return "admin-log";
    }

    @GetMapping("/login")
    public String getAdminLoginPage() {
        return "admin-login";
    }
}

(1) 로그인 페이지 구현

style 부분은 생략했다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <title>패밀링</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
</head>
<body>
<nav class="navbar navbar-expand-sm bg-light">
    패밀링
</nav>

<div class="login-container">
	<a href="/api/v1/admin/login/oauth/kakao" class="kakao-button"> 
        <img src="/images/kakao-login-img.png" alt="카카오 로그인" />
    </a>
</div>
</body>
</html>

(3) 백엔드 api 구성

  • 카카오 리다이렉트 부분
    oauth를 다루는 글은 아니기 때문에 생략했습니다 🙇‍♀️

  • 카카오 코드로 사용자 인증 부분
    1. 카카오 로그인 과정이 복잡해지면서 인증을 담당하는 AuthenticationService를 분리했다.
    2. 관리자인 경우에만 리다이렉트하도록 인가 과정을 추가했습니당!

//컨트롤러 코드의 일부
    @GetMapping("/api/v1/admin/login/oauth/kakao/code")
    public void requestKakaoLoginScreen(@RequestParam(value = "code") String code, HttpSession session, HttpServletResponse response) throws IOException {
        String accessToken = kakaoService.getKakaoAccessToken(code).accessToken();
        User user = kakaoService.saveKakaoLoginUser(accessToken,session);
        if (!authenticationService.isAdmin(user)) {
            throw new CustomException(ExceptionCode.NO_ADMINISTRATOR_RIGHTS);
        }
        String token = authenticationService.makeToken(user);
        response.addCookie(createCookie("Authorization", token));
        response.sendRedirect("/api/v1/admin/pages/log");
    }

💦 정적 이미지 접근안됌.


알고보니 정적 이미지 경로에 대해서도 시큐리티 설정에서 권한 허용을 설정해야했다.
이를 해결하고 나서 정상적으로 로딩할 수 있었다.

로그를 볼 수 있는 페이지를 만들자!


참고한 글

로그분석에 활용할 수 있는 EFK 스택 간단하게 정리해보기-매직

좋은 글 감사합니다 ... 🙇‍♀️🙇‍♀️ 
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글