📈

node.js에서 winston을 이용하여 GCP Cloud Logging 으로 로그 수집하기

Created
2024/02/29 00:31
Tags
안녕하세요.
볼드나인 백엔드 개발자 잭슨 입니다.
이번 글에서는 서버에서 생성하는 수많은 로그들을 GCP의 로깅 서비스인 Cloud Logging으로 전송하여 이를 수집하고 저장하는 방법과 검색하는 방법에 대해서 알아보겠습니다.

목적

기존에는 호스트에서 실행 중인 여러 도커 컨테이너에서 생성하는 엑세스 로그나 에러 로그를 호스트에 날짜별로 저장하고 있었습니다. 그래서 특정 이슈를 확인하거나 서버의 오류를 확인하기 위해서 호스트 서버에 직접 원격으로 접속하여 로그파일에 접근하여 로그를 확인하였습니다. 이런 식으로 로그를 확인할 경우 아래와 같이 몇 가지 단점이 있습니다.
1.
접근성 로그파일을 확인하기 위해서는 파일이 저장되어 있는 호스트 서버에 직접 접속하여야 합니다. 만약 호스트 서버가 특정 ip에 대해서만 접속이 가능하게 되어있다면 재택근무를 하거나 외부에서 로그를 확인하려고 하면 접속하는 ip를 화이트리스트에 등록을 해주어야 합니다. 이러한 방법은 아무래도 접근성이 좋지 못합니다.
2.
검색 원하는 로그를 찾기 위해서는 검색을 원하는 날짜의 파일을 선택하여 검색해야 합니다. 만약 특정 로그를 찾아야 하는데 어느 날짜의 파일에 있는지 모를 경우에는 모든 날짜의 파일을 모두 확인해야 합니다. 이는 시간이 매우 많이 소모됩니다.
3.
저장기간 호스트 볼륨에 로그 파일을 저장할 경우 모든 로그를 다 저장할 수가 없습니다. 로그는 매일 생성되는데 시간이 흐를수록 파일들이 계속해서 호스트에 쌓이게 됩니다. 그래서 저희는 일정 기간만 저장하고 있었는데 이럴 경우 오래된 로그는 확인할 수 없습니다.
이런 단점들을 해결하기 위해서 GCP의 Cloud Logging을 도입하게 되었습니다.
로그를 관리할 수 있는 여러 가지 툴이 있는데 저희 사내 인프라가 GCP에 구성이 되어있어서 GCP Cloud Logging을 선택하게 되었습니다.

GCP Cloud Logging 설정

Cloud Logging으로 로그를 전송하기 위해서 GCP 콘솔에서 설정해야 하는 부분을 알아보겠습니다.
1.
로그 스토리지에 로그 버킷 생성하기
서버에서 생성한 로그들을 저장하기 위한 저장소를 생성합니다.
먼저, 로그 스토리지 페이지로 이동해 줍니다.
이곳에서 로그 버킷을 생성할 수 있고 생성된 버킷과 전체 이번 달 수집된 로그와 지난달 수집된 로그의 크기를 확인할 수 있습니다. 로그 버킷 만들기를 클릭하여 버킷 생성 페이지로 이동합니다.
버킷 이름과 리전, 그리고 보관기간까지 설정하여 버킷을 생성합니다.
생성한 버킷을 확인할 수 있습니다.
2.
로그 라우터에서 싱크 생성하기
이제 방금 생성한 버킷으로 로그를 전송할 수 있도록 싱크를 생성해 주겠습니다.
로그 라우터 페이지로 이동해서 싱크 만들기를 클릭하여 싱크 생성 페이지로 이동합니다.
싱크 이름과 설명을 작성한 후 다음 버튼을 눌러줍니다.
이제 이 싱크로 들어오는 요청을 어디로 보내줄지 대상을 설정하는 단계입니다. 싱크 서비스를 Logging 버킷을 선택하면 아까 앞 단계에서 우리가 생성한 로그 버킷을 확인할 수 있습니다. 앞서 생성한 버킷을 선택하고 다음 버튼을 눌러 줍니다.
어떤 이름의 로그를 포함할지 필터를 설정해 줍니다. logName=projects/{프로젝트id}/logs/{로그이름} 위의 포맷으로 작성해 주는데 여기서 작성한 로그 이름이 winston으로 로그를 전송할 때 설정할 이름이 됩니다. 저는 my-log-sync로 작성해 보겠습니다. 여기까지 작성하고 싱크 만들기 버튼을 눌러 싱크를 생성합니다.
여기까지 설정해 주면 로그를 전송할 준비가 되었습니다. 이제 로그를 전송할 수 있게 코드를 작성해 보겠습니다.

winston 모듈을 이용하여 로그 전송

우리는 winston을 이용하여 서버에서 생성하는 로그를 전송해 줄 건데 편리하게도 GCP에서 이를 쉽게 해주는 @google-cloud/logging-winston 이라는 모듈을 제공해 줍니다.
[참고 링크] https://cloud.google.com/logging/docs/setup/nodejs?hl=ko#using_winston
winston과 @google-cloud/logging-winston 모듈을 설치해 줍니다.
npm i winston @google-cloud/logging-winston
Bash
복사
그리고 아래와 같이 코드를 작성해 줍니다.
// src/util/logger.ts import { LoggingWinston } from '@google-cloud/logging-winston'; import * as winston from 'winston'; // 1 const loggingWinston = new LoggingWinston({ projectId: 'GCP_PROJECT_ID', credentials: { private_key: 'GCP_PRIVATE_KEY', client_email: 'GCP_CLIENT_EMAIL', }, logName: 'my-log-sync', }); // 2 export const logger = winston.createLogger({ transports: [loggingWinston], });
TypeScript
복사
1.
@google-cloud/logging-winston 모듈에서 제공해 주는 LoggingWinston 클래스 인스턴스를 생성합니다. 이때 GCP api를 사용할 때 필요한 서비스 계정이 필요한데 서비스 계정 생성하는 방법은 잘 나와 있으므로 구글 검색하여 생성하고 private key까지 같이 생성하여 credential에 입력해 줍니다.
2.
생성한 클래스 인스턴스를 winston logger 생성할 때 transports 옵션에 넣어줍니다.
이제 개발 하면서 아래와 같이 찍는 로그가 GCP 의 로그 버킷으로 전송이 됩니다.
// src/util/logger-test.ts import { logger } './logger' logger.info('Hello, this is log from server'); logger.error('Hello, this is error from server')
TypeScript
복사

로그 탐색기

서버에서 생성한 로그를 로그 버킷으로 전송했으니 전송한 로그를 확인하는 로그 탐색기에 대해서 알아봅시다.
앞서 로그 버킷을 만들었던 로그 스토리지 페이지로 와서 로그를 확인하고자 하는 버킷의 더보기 버튼을 누르고 ‘이 버킷의 로그 보기’를 눌러 로그 탐색기로 이동합니다.
전송된 로그를 확인할 수 있는 로그 탐색기가 나타납니다.
몇가 지 자주 사용하는 부분을 표시해 놨습니다.
기본적으로 가운데 위에 표시된 에디터를 이용해서 로그를 검색할 수 있습니다.
jsonPayload.message: “Hello” 라고 작성이 되어있는데 logger.info나 logger.error로 전송한 메세지가 기본적으로 jsonPayload.message 로 전송이 됩니다.
쿼리를 작성하고 오른쪽 상단에 쿼리 실행을 누르면 로그 탐색이 시작되고 아래에서 쿼리 결과를 확인할 수 있습니다.
그리고 좌측 위의 최근 2일이라고 적힌 설정 버튼을 이용하여 조회를 원하는 기간을 설정할 수 있습니다.
특정 시간이나 특정 날짜에 포함된 로그를 검색할때 유용합니다.

마치며

이상으로 GCP Cloud Logging으로 로그를 수집하고 확인하는 방법에 대해서 알아보았습니다.
서비스를 운영하면서 장애나 예상하지 못한 상황에 빠르고 정확하게 대응하기 위해서는 로그를 잘 남기고 이를 빠르게 검색할 수 있어야 합니다.
특히 MSA 환경에서 운영되는 서비스는 여러 인스턴스에서 생성되는 로그들을 하나의 장소로 중앙화하여 관리하는 것이 필요합니다.
이러한 것을 편리하게 하기위해서 다양한 로깅툴이 있는데 GCP Cloud Logging 이외에 다양한 로깅 툴을 비교해 보고 서비스에 맞는 것을 선택하여 연동하면 서비스 운영에 많은 도움이 되리라 생각합니다.
처음 Cloud Logging을 연동할 때 관련된 자료를 찾기가 힘들었는데 이 글이 조금이나마 도움이 되면 좋겠습니다.
감사합니다.