IT 인프라가 점점 커지고 복잡해질수록 모든 시스템이 제대로 관리되고 있는지 확인하는 데 더 많은 시간과 노력을 쏟게 됩니다.
특히 클라우드가 보편화된 이후에는 기술 정보가 여러 곳에 흩어져 있어 이러한 부담이 한층 커졌습니다.
하지만 포괄적인 로그 분석을 직접 수행하는 일은 번거롭고 시간이 많이 걸리며, 솔직히 말해 지루한 작업입니다.
이런 부담에서 벗어나는 간단하면서도 효과적인 방법은 로그 모니터링을 쉽게 만들어 주는 소프트웨어나 애플리케이션을 활용하는 것입니다. 바로 그런 목적으로 Alexis Gardin이 만든 것이 Logub입니다.
다른 많은 SaaS 솔루션과 달리, Logub은 온프레미스에서 실행할 수 있고 오픈소스라는 큰 장점이 있습니다. 아래의 단계를 따라 하면 애플리케이션 로그를 수집·탐색·분석해 주는 애플리케이션을 직접 만들 수 있습니다.
이 애플리케이션의 핵심은 RediSearch의 강력한 기능입니다. RediSearch는 여러 위치에 흩어진 로그를 비교할 수 없는 효율성으로 탐색하고 분석할 수 있게 해 줍니다. Alexis가 어떻게 이 애플리케이션을 완성했는지 함께 살펴보겠습니다.
본격적으로 들어가기 전에, Redis Launchpad에서 확인할 수 있는 다양한 흥미로운 애플리케이션들도 살펴보시길 권합니다.
- 무엇을 만들게 되나요?
- 필요한 것들은 무엇인가요?
- 아키텍처
- 시작하기
- 데이터 저장 방식
- 데이터 조회 방식
- 검색창은 어떻게 작동하나요?
- Logub을 프로젝트에 통합하는 방법
- 결론
1. 무엇을 만들게 되나요?
Redis 기반으로 로그를 수집, 분석, 탐색하는 특별한 앱을 만들게 됩니다. 아래 단계에서는 이 애플리케이션을 구축하는 데 필요한 전 과정(A부터 Z까지)과 필요한 구성 요소들을 하나씩 다룹니다.
Redis가 처음이라도 걱정하지 마세요. 이 강력한 데이터베이스를 어떻게 다루는지 차근차근 알려 드립니다. 시작할 준비되셨나요?
자, 바로 시작해 보겠습니다.
2. 필요한 것들은 무엇인가요?
- Fluentd: 로그 처리를 위한 크로스 플랫폼 오픈소스 데이터 수집 소프트웨어입니다.
- Fluentd용 Redis 출력 플러그인(fluent-plugin-redis): Fluentd가 로그를 Redis로 출력할 수 있게 해 주는 플러그인입니다.
- Docker: 개발자가 애플리케이션을 컨테이너로 패키징할 때 사용하는 플랫폼입니다.
- Docker Compose: 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다.
3. 아키텍처
- Fluentd가 다양한 대상에서 각 애플리케이션의 모든 로그를 수집합니다.
- Fluentd가 수집한 로그를 형식화한 뒤 저장을 위해 Redis로 전송합니다.
- 데이터는 Fluentd Redis 플러그인(Redis 출력용 Fluent 플러그인)을 통해 저장됩니다.
- Logub 백엔드는 RediSearch가 사용자가 정의한 필드에 대해 전문 검색(full-text search)과 인덱싱을 수행할 수 있도록 지원합니다.
4. 시작하기
데모에서는 DEMO 앱이 Logub에 로그를 발행(publish)합니다. DEMO 앱과 상호작용하여 로그를 생성한 후, Logub에서 해당 로그를 요청해 볼 수 있습니다.
사전 준비 사항
- Docker
- Docker Compose
먼저 시스템에서 다음 포트들이 열려 있는지 확인하세요: 8080, 8081, 3000, 6379.
1단계: 리포지토리 클론
git clone https://github.com/redis-developer/logub
2단계: DEMO 앱 실행
- /demo 폴더로 이동합니다 (
cd ./demo). - 아래 명령어로 docker-compose를 실행합니다.
Logub 데모 실행하기
브라우저에서 localhost:3000으로 접속하면 로그를 탐색할 수 있습니다.
로그가 표시되기까지 약 1분 정도 걸릴 수 있습니다. 화면 우측 사이드바의 필터로 로그를 걸러서 볼 수 있고, 상단 검색창을 통해 필터 검색 또는 전문 검색으로 로그를 찾을 수도 있습니다.
로그 항목을 클릭하면 상세 정보가 표시되며, 비즈니스 속성(business properties)을 인덱싱할 수 있는 옵션이 제공됩니다. 이렇게 인덱싱된 비즈니스 속성은 이후 필터 조건으로 활용할 수 있습니다.
다음으로 localhost:3000/demo에 접속하면 플레이그라운드에 들어가 직접 커스텀 로그를 추가할 수 있습니다. 이 데모 페이지에서 할 수 있는 작업은 다음과 같습니다.
- 데모용 가상 앱에서 가짜(fake) 사용자를 생성하고 로그에서 확인하기
- 시스템에 직접 로그 발행하기
메인 페이지로 돌아가면 방금 생성한 로그를 검색해 볼 수 있습니다.
참고: 컨테이너에서 로그가 생성된 시점과 Logub에 표시되는 시점 사이에는 약 1분의 지연 시간이 있습니다. 이는 로그를 수집하고, 형식화하고, 데이터베이스에 적재(ingest)하는 과정에서 발생하는 지연입니다.
5. 어떻게 작동하나요?
데이터 저장 방식
데이터는 Fluentd Redis 플러그인을 통해 저장됩니다. 각 로그는 HSET 명령으로 저장됩니다. 예를 들면 다음과 같습니다: HSET level DEBUG message "Hello World" thread main
데이터 조회 방식
로그를 조작하고 Redis에서 가져올 때 사용하는 객체입니다. 이 과정을 통해 Logub UI가 로그를 화면에 표시할 수 있습니다. 로그에 대해 복잡한 쿼리를 수행하려면 RediSearch를 사용하면 됩니다.
RediSearch 스키마는 동적으로 변경할 수 있으므로, 'List' 자료구조를 활용해 어떤 스키마가 인덱싱되어 있는지 추적할 수 있습니다.
위 명령을 사용하면 사용자 입력을 기반으로 일반 텍스트 형태의 RediSearch 쿼리를 생성할 수 있습니다. RediSearch 라이브러리 위에는 다양한 작은 QueryBuilder들이 구현되어 있습니다. Logub UI가 로그에서 포괄적이고 효율적인 검색을 수행하기 위해 전송하는 명령 역시 동일합니다.
검색창 사용 방법
태그 검색 또는 전문 검색으로 로그를 찾을 수 있습니다. 막힐 때 참고할 수 있는 예시 몇 가지를 소개합니다.
env:dev Ut ea vero voluptate*— dev 환경의 모든 로그 중 "Ut ea vero voluptate"로 시작하는 메시지를 검색합니다.-env:prod Ut ea vero voluptate*— prod 환경을 제외한 모든 환경의 로그 중 "Ut ea vero voluptate"로 시작하는 메시지를 검색합니다.originRequest:France originRequest:USA— originRequest 필드 값이 France 또는 USA인 모든 로그를 검색합니다."dog" "cat"— "dog"와 "cat" 두 단어를 모두 포함하는 로그를 검색합니다.-"dog" "cat"— "dog"는 포함하지 않으면서 "cat"은 포함하는 로그를 검색합니다.
앱으로 좋은 테스트 경험을 얻으려면, 플레이그라운드에서 직접 로그를 만들고 비즈니스 속성을 추가한 뒤 여러 실험을 해보며 감각을 익히기를 강력히 권장합니다.
Logub을 프로젝트에 통합하는 방법
Logub 운영에 필요한 Docker 이미지 목록:
- 로그를 수집해 Redis로 전송하는 Logub Fluentd 이미지 (Logub Fluentd Image)
- RediSearch 모듈이 포함된 Redis 이미지 (Redis Mod Image)
- 로그 탐색 기능을 제공하는 Logub 컨트롤러 이미지 (Logub Controller Image)
- 로그를 탐색하고 쿼리하는 Logub UI 이미지 (Logub UI Image)
Logub 로그 형식
현재 Logub은 특정 로그 형식만 처리할 수 있습니다. 향후 이 형식은 확장되어 더욱 유연하게 커스터마이징할 수 있을 예정입니다.
Logub 형식은 다음과 같습니다.
단, 아래 필드들은 필수가 아닙니다.
비즈니스 속성을 추가하려면 키가 "mdc"인 중첩 JSON 객체를 추가해야 합니다. 예를 들면 다음과 같습니다.
Logub에 로그 발행하기
Logub에서 로그를 탐색하려면 컨테이너가 Docker Fluentd 로깅 드라이버를 사용해야 합니다. 고객 통합을 위한 설정 예시는 다음과 같습니다.
Logub에서 Redis 설정하기
RediSearch
Logub은 애플리케이션 로그를 처리하기 위해 RediSearch의 기능을 활용합니다. 로그가 Redis 데이터베이스에 저장될 때 세 가지 유형의 필드가 함께 저장됩니다.
- 시스템 속성(System properties): 로그 전송 시 Docker와 Fluentd가 제공하는 정보입니다 (예: 환경, 컨테이너 이름 등).
- 기본 속성(Basic properties): 로그가 기본적으로 갖는 정보입니다 (예: 타임스탬프, 서비스 등). 이 속성들은 RediSearch에서 자동으로 인덱싱됩니다.
- 비즈니스 속성(Business properties): Logub 사용자가 특정 필드를 통해 제공하는 속성입니다. 사용자는 Key-Value(Map) 형식을 따라야 합니다. RediSearch의 고급 기능 덕분에 원한다면 이 '비즈니스 속성'들을 인덱싱하여 검색에 활용할 수 있습니다.
다음은 Fluentd가 로그를 평탄화(flatten)하여 Redis 데이터베이스에 저장할 때 이 도구가 어떻게 작동하는지 보여주는 로그 예시입니다. Logub API를 사용하면 사용자나 회사가 mdc 객체의 일부 또는 전체 필드를 인덱싱할 수 있습니다.
이 프로젝트에서는 Tag 데이터 타입이 널리 사용됩니다. 로그 검색은 종종 비즈니스 속성을 기준으로 수행되기 때문입니다 (예: 고객 ID). 또한 로그 메시지에는 TextField 데이터 타입을 사용하여 해당 필드에서 전문 검색이 가능하도록 했습니다.
다음은 검색 과정을 단순화한 스키마입니다.
Redis
Redis는 Fluentd가 로그를 저장하는 데 사용되며, 로그는 Redis의 HashSet 타입으로 저장됩니다.
사용자가 인덱싱한 필드를 추적하려면 Redis의 List 타입을 사용하는 'schema' 객체를 추가할 수도 있습니다.
결론: RediSearch로 로그의 복잡함을 걷어내다
클라우드 같은 디지털 혁신이 폭발적으로 확산된 결과 중 하나는 IT 인프라 모니터링이 복잡해졌다는 점입니다. 애플리케이션이 여러 위치에 흩어져 있으면 모든 로그를 한곳에 모으는 것조차 어려운 일이 됩니다.
하지만 Redis를 활용하면 이 단조로운 과정에서 벗어나 로그를 손쉽게 검색, 수집, 저장할 수 있습니다. 이 애플리케이션이 만들어진 과정에 대해 더 자세히 알고 싶다면 Alexis의 YouTube 영상을 확인해 보세요.
또한 저희 Launchpad에는 Alexis처럼 재능 있는 프로그래머들이 개발한 혁신적인 애플리케이션들이 가득합니다. 지금 확인하고 영감을 얻어, Redis로 어떤 혁신을 만들어 낼 수 있을지 생각해 보세요.
이 애플리케이션을 만든 사람은 누구인가요?
Alexis Gardin
Alexis는 현재 Zendoc에서 근무 중인 혁신적인 소프트웨어 엔지니어입니다. GitHub 페이지에서 그가 참여한 다른 프로젝트들도 확인해 보세요.