Node.js 로깅 도구: 심층 분석 및 비교
Min-jun Kim
Dev Intern · Leapcell

Node.js 로깅 도구 심층 분석 및 비교
소프트웨어 엔지니어링 분야에서 로깅은 없어서는 안 될 중요한 구성 요소입니다. 애플리케이션 작동 중 발생하는 다양한 이벤트를 꼼꼼하게 기록함으로써 로그는 개발자에게 귀중한 정보를 제공하여 코드가 실제로 어떻게 실행되는지 깊이 이해할 수 있도록 합니다. 이는 디버깅, 성능 최적화 및 문제 해결에 도움이 됩니다. 이 기사에서는 Bunyan, Winston, Pino, Morgan 및 npmlog를 포함한 Node.js 환경의 여러 주류 로깅 도구에 중점을 두고 기능, 사용 방법, 장단점에 대한 자세한 분석 및 비교를 수행합니다.
로깅의 핵심 요소
애플리케이션 로그를 처리할 때 로그 수준을 이해하는 것은 기본적인 중요한 측면입니다. 로그 수준은 긴급성에 따라 로그 파일의 항목을 분류하고 표시하는 표준입니다. 각 로그 메시지는 메시지의 중요도와 긴급성을 반영하는 특정 로그 수준에 해당합니다. Node.js에서 가장 일반적인 로그 수준은 다음과 같습니다.
- ERROR: 즉시 해결해야 하는 심각한 문제를 나타냅니다. 일반적으로 이러한 오류로 인해 애플리케이션의 일부 기능이 제대로 작동하지 못하지만 애플리케이션은 계속 실행될 수 있습니다. 예를 들어 데이터베이스 연결이 실패하고 데이터를 제대로 저장할 수 없는 경우 ERROR 수준 로그를 기록해야 합니다.
- INFO: 발생한 일상적인 이벤트를 기록하는 데 사용됩니다. 이러한 유형의 정보는 일반적으로 애플리케이션의 정상적인 실행 상태와 진행률을 표시하는 데 사용됩니다. 예를 들어 사용자가 시스템에 성공적으로 로그인하거나 주문이 성공적으로 생성되는 것과 같은 이벤트는 INFO 수준으로 기록할 수 있습니다.
- DEBUG: 디버깅 단계에서만 유용한 자세한 정보가 포함되어 있으며 프로덕션 환경에서는 가치가 떨어질 수 있습니다. 예를 들어 개발 중에 함수 매개변수 전달 및 변수 값 변경과 같은 정보를 기록하면 개발자가 코드 논리 문제를 찾는 데 도움이 됩니다.
- WARN: 잠재적으로 유해한 상황을 나타냅니다. 현재 심각한 오류를 일으키지는 않지만 향후 문제를 일으킬 수 있습니다. 예를 들어 시스템 리소스가 임계값에 가까워지거나 구성 파일에 호환되지 않는 설정이 있는 경우 WARN 수준 로그를 기록해야 합니다.
- FATAL: 애플리케이션이 즉시 종료될 것으로 예상되는 매우 심각한 오류 이벤트를 나타냅니다. 시스템 메모리 부족 또는 중요한 프로세스의 충돌과 같은 상황은 FATAL 수준으로 기록해야 합니다.
Node.js 로깅 라이브러리에 대한 자세한 설명
Bunyan
Bunyan은 Node.js 생태계에서 널리 사용되는 로깅 도구입니다. 또한 로그의 멋진 CLI 뷰를 제공하는 간단하고 효율적인 JSON 로깅 라이브러리입니다. 다른 로그 수준은 다른 색상으로 구분되어 개발자가 빠르게 식별하고 볼 수 있습니다. 2025년 4월 28일 현재 GitHub에서 7.2k개의 별과 522개의 이슈가 있습니다.
설치
Bunyan을 설치하려면 터미널에서 다음 명령을 실행하십시오.
npm i bunyan
사용법
test.js
라는 파일을 만들고 Bunyan 라이브러리를 가져옵니다.
const bunyan = require('bunyan');
createLogger
메서드를 사용하여 로거 인스턴스를 정의합니다.
var log = bunyan.createLogger({ name: 'leapcell-test', stream: process.stdout });
- 로거를 사용하여 데이터를 기록합니다.
log.info('hi');
test.js
파일을 실행하면 콘솔에 다음과 유사한 출력이 표시됩니다.
{"name":"leapcell-test","hostname":"your_hostname","pid":xxxx,"level":30,"msg":"hi","time":"2025-04-28Txx:xx:xx.xxxZ","v":0}
Bunyan에서 생성된 로그는 JSON 형식이며 각 로그에는 로그 발생 시간과 같은 주요 정보가 포함되어 있음을 알 수 있습니다. 실제 애플리케이션에서는 이러한 로그가 일반적으로 후속 참조 및 분석을 위해 파일에 저장됩니다.
장점
- 다중 런타임 지원: Node.js 외에도 Webpack, Browserify 및 NW.js와 같은 여러 런타임 환경을 지원합니다.
- 직렬화 메커니즘: 직렬화 개념이 있으며 JavaScript 객체를 JSON 직렬화 가능한 객체로 변환할 수 있습니다. 특정 로거 인스턴스는
serializer
를 통해 로그 기록 필드 이름을 직렬화 함수에 매핑할 수 있습니다. - 하위 로그 기능: 개발자는 애플리케이션의 하위 구성 요소에 대한 전용 로거를 만들고 로그 기록에 추가 바인딩 필드를 포함할 수 있으므로 특정 모듈의 자세한 로그 관리에 편리합니다.
윈스턴
Winston은 Node.js 분야에서 최고의 로깅 라이브러리 중 하나입니다. 크고 활발한 커뮤니티와 풍부한 기능을 통해 GitHub에서 23.5k개의 별과 1.6k개의 이슈를 받았습니다. 로깅 기능과 다양한 구성 옵션을 분리하여 높은 수준의 확장성과 유연성을 달성하여 개발자가 다양한 복잡한 로깅 요구 사항을 쉽게 충족할 수 있도록 합니다.
설치
Winston을 설치하려면 터미널에서 다음 명령을 실행하십시오.
npm i winston
사용법
- 루트 파일에서 Winston 라이브러리를 가져오고 로거 인스턴스를 만듭니다.
const winston = require('winston'); const logger = winston.createLogger({});
- 로그 수준, 형식 및 메타 설명 설정과 같이
createLogger
메서드를 통해 다양한 구성을 수행합니다.
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { service: 'leapcell-test' }, });
transports
배열을 통해 파일에 로그를 쓰도록 지정할 수 있습니다.
const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { service: 'leapcell-test' }, transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), ], });
위의 구성은 모든 오류 수준 로그가 error.log
파일에 기록되고 다른 로그가 combined.log
파일에 기록됨을 의미합니다. 또한 winston.transports.Console()
을 transports
배열에 추가하여 콘솔에만 로그를 표시하도록 선택할 수도 있습니다.
장점
- 클라우드 로그 통합: logz.io 및 AWS Cloudwatch와 같은 클라우드 로깅 서비스에 로그를 보내는 것을 지원합니다. 기존의 정적 파일 저장 또는 콘솔 기록과 비교하여 더욱 강력한 로그 관리 및 분석 기능을 제공합니다.
- 편리한 추적: 각 로그에는 타임스탬프와 로그 수준이 포함되어 있어 개발자가 특정 상황에 따라 문제를 신속하게 추적하고 찾을 수 있습니다.
피노
Pino는 "극히 낮은 오버헤드"로 알려져 있으며 효율적인 Node.js 로거입니다. 리소스 소비를 최소화하여 빠른 로깅을 달성합니다. 시간이 지남에 따라 기록된 정보는 계속 증가하지만 애플리케이션 성능에 큰 영향을 미치지 않습니다. 예를 들어 초당 요청 수가 크게 줄어들지 않습니다. 2025년 4월 28일 현재 GitHub에서 15.3k개의 별과 530개의 이슈가 있습니다.
설치
Pino를 설치하려면 터미널에서 다음 명령을 실행하십시오.
npm i pino
사용법
Pino를 사용하는 것은 매우 간단하고 간단합니다. 라이브러리를 가져와 초기화하기만 하면 됩니다.
const logger = require('pino')(); logger.info('hello world');
위의 스크립트를 실행하면 콘솔에 다음과 유사한 출력이 표시됩니다.
{"level":30,"time":xxxxxxx,"msg":"hello world","pid":xxxx,"hostname":"your_hostname"}
출력 로그 데이터에는 로그 수준, 기록 시간, 실제 로그 정보, 프로세스 ID 및 호스트 이름이 포함됩니다.
Express.js에서 사용법
pino-http
패키지를 설치합니다.
npm install pino-http
- Express.js 애플리케이션에서 사용합니다.
const express = require('express'); const pino = require('pino-http'); const app = express(); const pinoInstance = pino(); app.use(pinoInstance); app.post('/do-stuff', (req, res) => { req.log.info('Something done'); res.send('Say hello to Pino'); }); app.listen(5500);
장점
- 포맷 도구: NDJSON(Newline Delimited JSON)을 기반으로 하는 포맷터인
pino-pretty
모듈을 제공합니다. NDJSON은 레코드를 하나씩 처리할 수 있는 효율적인 구조화된 데이터 저장 및 스트리밍 형식입니다.pino-pretty
는 로그 수준, 타임스탬프 및 기타 정보에 따라 로그 데이터에 대한 추가 서식을 수행하여 로그를 더욱 읽기 쉽게 만듭니다.npm install -g pino-pretty
를 통해 전역으로 설치한 다음node app.js | pino-pretty
명령을 사용하여 애플리케이션을 실행하여 서식이 지정된 형태로 로그를 볼 수 있습니다.
모건
Morgan은 HTTP 요청 기록을 위해 특별히 설계된 Node.js 라이브러리입니다. 일반적으로 모든 HTTP 요청 추적을 달성하기 위해 Express.js와 같은 웹 프레임워크에 미들웨어로 통합됩니다. 다른 범용 로깅 도구와 달리 HTTP 요청 로깅에 중점을 둡니다. 현재 GitHub에서 8k개의 별과 485개의 이슈가 있습니다.
설치
Morgan을 설치하려면 터미널에서 다음 명령을 실행하십시오.
npm i morgan
사용법
- Morgan 라이브러리를 가져와서 Express.js 미들웨어로 추가합니다.
var morgan = require('morgan'); app.use(morgan('dev'));
여기서 dev
는 Morgan의 로그 형식 중 하나입니다. Morgan은 총 5개의 로그 형식을 구현했습니다.
- combined: 표준 Apache 결합 로그 출력 형식을 사용합니다.
- common: 또한 표준 Apache 결합 로그 출력 형식을 사용합니다.
- dev: 응답 상태를 다양한 색상으로 표시하는 간결한 출력 형식으로 개발 환경에 적합합니다.
- short: 응답 시간을 포함하고 기본적으로 로그를 단순화합니다.
- tiny: 최소화된 출력 형식을 사용합니다.
- 필요에 따라 구성에 대해 다른 형식을 선택할 수 있습니다.
app.use(morgan('combined')); app.use(morgan('common')); app.use(morgan('dev')); app.use(morgan('short')); app.use(morgan('tiny'));
장점
다양한 사전 정의된 로그 형식을 제공합니다. 개발자는 복잡한 구성 코드를 작성하지 않고도 프로젝트 요구 사항 및 사용 시나리오에 따라 적절한 형식을 빠르게 선택할 수 있으므로 개발 시간을 크게 절약할 수 있습니다.
npmlog
npmlog는 npm에서 공식적으로 사용하는 로깅 도구입니다. 다른 Node.js 로깅 라이브러리와 유사하게 사용자 지정 로그 수준, 색상 출력, 개발자가 서로 다른 로그 수준에 대한 개인화된 색상을 설정할 수 있습니다. GitHub에서 458개의 별과 55개의 이슈가 있습니다.
설치
npmlog를 설치하려면 터미널에서 다음 명령을 실행하십시오.
npm i npmlog
사용법
- 테스트 파일을 만들고 npmlog 패키지를 가져옵니다.
const log = require('npmlog'); log.info('hello leapcell', 'Hello from logrocket', {'message': 'test'});
log.info
메서드는 로그 접두사, 실제 로그 정보 및 추가 데이터인 최대 3개의 매개변수를 허용할 수 있습니다.
장점
로그 헤더, 제목 스타일 설정 및 로그 수준 정의와 같은 풍부한 메서드 세트가 있어 개발 중 로그 관련 작업을 단순화하고 개발 효율성을 향상시킬 수 있습니다.
Node.js 로깅 라이브러리의 통계 비교
라이브러리 이름 | GitHub 별 | GitHub 이슈 수 | 주요 기능 및 적용 가능한 시나리오 |
---|---|---|---|
Bunyan | 7.2k | 522 | JSON 형식 로그, 다중 런타임 지원, 로그 구조화 및 교차 환경 사용에 대한 요구 사항이 높은 프로젝트에 적합 |
Winston | 23.5k | 1.6k | 확장성 및 유연성이 높고 클라우드 로깅 서비스를 지원하며 복잡한 애플리케이션 및 다양한 로그 관리 요구 사항이 있는 시나리오에 적합합니다. |
Pino | 15.3k | 530 | 오버헤드가 낮고 성능 요구 사항이 매우 높고 로그 볼륨이 큰 Node.js 애플리케이션에 적합합니다. |
Morgan | 8k | 485 | HTTP 요청 로깅에 중점을 두고 웹 애플리케이션 및 API 서비스에 적합하며 요청 추적 및 분석에 편리합니다. |
npmlog | 458 | 55 | 공식 npm 로깅 도구, npm 관련 프로젝트 및 간단한 로깅 기능 요구 사항이 있는 시나리오에 적합합니다. |
결론
Node.js 생태계의 풍부한 로깅 도구는 개발자에게 다양한 선택지를 제공하여 실제 프로젝트에서 로깅 기능을 쉽게 구현할 수 있도록 합니다. 그러나 올바른 로깅 라이브러리를 선택하는 것이 중요합니다. 애플리케이션의 특정 요구 사항, 성능 요구 사항, 배포 환경 및 로그 관리의 복잡성과 같은 요소를 종합적으로 고려해야 합니다. 개발자는 필요한 데이터를 정확하게 기록하고 문제를 분석하고 해결하기 쉬우며 애플리케이션 성능에 너무 많은 영향을 미치지 않아 프로젝트의 안정적인 운영 및 지속적인 최적화를 강력하게 지원할 수 있는 로깅 도구를 선택해야 합니다.
Leapcell: 최고의 서버리스 웹 호스팅
마지막으로, Node.js 서비스를 배포하는 데 가장 적합한 플랫폼인 **Leapcell**을 추천합니다.
🚀 좋아하는 언어로 빌드
JavaScript, Python, Go 또는 Rust로 손쉽게 개발하세요.
🌍 무제한 프로젝트를 무료로 배포
사용한 만큼만 비용을 지불하세요. 요청도 없고 요금도 없습니다.
⚡ 사용한 만큼 지불, 숨겨진 비용 없음
유휴 요금 없이 원활한 확장성만 제공합니다.
🔹 Twitter에서 팔로우하세요: @LeapcellHQ