본문 바로가기

개발

Node.js 로깅(winston)과 디버깅(debug)

Node.js 애플리케이션을 개발하면서 로그 기록과 디버깅은 필수적인 요소입니다. 로깅은 애플리케이션의 상태와 동작을 추적하고, 디버깅은 오류를 발견하고 수정하는 데 도움을 줍니다. Node.js에서는 다양한 로깅 및 디버깅 도구와 라이브러리가 제공되며, 이 중에서 winston과 debug가 널리 사용됩니다. 이 글에서는 Node.js에서의 로깅과 디버깅에 대해 다루고, winston과 debug의 사용 예시 코드를 살펴보겠습니다.

 

Winston(로깅)

로깅 라이브러리인 winston은 로그를 생성, 기록, 출력하는 데 사용됩니다. winston은 다양한 출력 형식, 로그 수준, 로그 저장소 등을 지원하여 개발자가 로깅 시스템을 유연하게 구성할 수 있도록 도와줍니다.

winston을 사용하기 위해서는 우선 설치해야 합니다. npm을 사용하여 다음과 같이 설치할 수 있습니다

npm install winston
const winston = require('winston');

// 로그 생성
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'app.log' })
  ]
});

// 로그 기록
logger.info('정보 로그');
logger.warn('경고 로그');
logger.error('에러 로그');

 

위의 예시 코드에서는 winston 모듈을 가져와 createLogger() 메서드를 사용하여 로그 생성을 설정합니다. 로그 수준(level)은 info로 설정되어 있으며, 포맷(format)은 타임스탬프와 JSON 형식으로 설정되어 있습니다. 출력(transport)으로는 콘솔(Console)과 파일(File)이 설정되어 있습니다.

로깅 수준은 로그의 중요도에 따라 설정할 수 있습니다. error, warn, info, verbose, debug, silly와 같은 다양한 수준을 지원하며, 해당 수준보다 중요도가 높은 로그만 출력됩니다.

출력 형식은 로그 메시지를 어떻게 표시할지 결정하는데 중요한 역할을 합니다. winston은 다양한 포맷터를 제공하며, 필요에 따라 조합하여 사용할 수 있습니다. 위의 예시에서는 타임스탬프와 JSON 형식을 조합하여 로그를 기록합니다.

또한, 출력(transport)으로는 콘솔(Console)과 파일(File)을 설정했습니다. 콘솔 출력은 개발 중에 실시간으로 로그를 확인하는 데 유용하며, 파일 출력은 로그를 파일에 저장하여 나중에 분석하거나 추적하는 데 도움이 됩니다.

 

Debug(디버그)

 

debug는 간편하면서도 효과적인 디버깅 방법을 제공합니다. debug는 네임스페이스를 통해 개별 모듈 또는 파일별로 디버그 로그를 활성화할 수 있는 기능을 제공하여 디버깅을 더욱 편리하게 수행할 수 있습니다.

debug를 사용하기 위해서는 우선 설치해야 합니다. npm을 사용하여 다음과 같이 설치할 수 있습니다

npm install debug

아래와 같이 사용합니다.

const debug = require('debug')('app');

// 디버깅 메시지 출력
debug('디버깅 메시지');

 

위의 예시 코드에서는 debug 모듈을 가져와 debug() 함수를 호출하여 디버깅 메시지를 출력합니다. 함수 호출 시 인자로는 네임스페이스를 지정하는 문자열을 전달합니다. 네임스페이스는 개별 모듈 또는 파일에 해당하는 식별자로 설정할 수 있습니다.

디버그 로그를 출력하려면 실행할 때 DEBUG 환경 변수를 설정해야 합니다. 터미널에서 다음과 같이 명령을 실행합니다

DEBUG=app node app.js

 

DEBUG 환경 변수를 app으로 설정하고 애플리케이션을 실행합니다. 이제 debug로 설정한 네임스페이스가 있는 로그만 출력됩니다. 네임스페이스를 구성하는 방법은 다양합니다. 개별 파일 또는 모듈에 디버그 로그를 적용하려면 네임스페이스를 해당 파일 또는 모듈의 이름으로 설정하면 됩니다. 예를 들어, app.js 파일과 database.js 파일이 있다고 가정해 봅시다. 각각의 파일에서 디버그 로그를 출력하려면 다음과 같이 설정할 수 있습니다

// app.js
const debug = require('debug')('app');

// 디버그 메시지 출력
debug('애플리케이션 로그');

// database.js
const debug = require('debug')('database');

// 디버그 메시지 출력
debug('데이터베이스 로그');

 

위의 예시 코드를 참고하여 Node.js에서 winston과 debug를 활용하여 로깅과 디버깅을 수행해보세요. 실제로는 로그 레벨, 출력 형식, 로그 파일 경로 등을 더욱 세부적으로 설정할 수 있으며, 디버깅 메시지도 개발 중에 필요한 위치에 적절히 추가하여 사용하면 됩니다. 로깅과 디버깅은 애플리케이션의 안정성과 유지보수성을 높이는 데 중요한 역할을 합니다.