winston을 이용해 로깅 기능 만들기

이상문
4 min readMay 8, 2023

Node.js 애플리케이션을 구축할 때 로깅은 개발 프로세스의 필수적인 부분이다. 이를 통해 개발자는 애플리케이션의 동작과 성능을 추적하고 디버깅할 수 있다. Winston은 로깅을 보다 쉽고 효율적으로 수행할 수 있는 다양한 기능을 제공하며 Node.js에서 가장 많이 사용되는 로깅 라이브러리이다.

이 글에서는 Node.js 애플리케이션에서 로깅을 위해 Winston을 사용하는 방법을 정리한다. Winston의 기본 사항부터 설명한 다음 전송 추가 및 로그 형식 사용자 지정과 같은 고급 주제로 진행하고자 한다.

Winston 시작하기

Winston을 시작하려면 먼저 npm을 통해 설치해야 한다.

npm install winston

이제 Winston을 사용하여 기본 로거를 만든다.

const { createLogger } = require('winston');

const logger = createLogger({
level: 'info'
});

위 코드에서는 Winston 모듈에서 createLogger 함수를 가져와서 새 로거 인스턴스를 만드는 데 사용한다. 로깅 수준을 info로 설정했는데, 이는 로거가 info 수준 이상의 메시지만 출력한다는 의미이다.

메시지 로깅

로거를 만들었으므로 메시지 로깅을 시작할 수 있다. Winston은 다양한 수준에서 메시지를 로깅하는 방법을 제공한다.

logger.info('Hello, Winston!');

위 코드에서는 info 메서드를 사용하여 info 수준으로 메시지를 기록한다. Winston은 error, warn, verbose 및 debug와 같은 다른 로깅 메서드도 제공한다. 각 메서드는 서로 다른 로깅 수준에 해당한다.

전송(transport) 추가

Winston은 콘솔에 메시지를 로깅하는 것 외에도 다른 대상으로 로그 메시지를 보내기 위한 전송(transport) 추가를 지원한다. 전송은 로그 메시지를 파일이나 원격 서버와 같은 특정 위치로 전달하는 메커니즘이다.

const { createLogger, transports } = require('winston');
const { File } = transports;

const logger = createLogger({
level: 'info',
transports: [
new File({ filename: 'app.log' })
]
});

위 코드에서는 Winston에서 transports 모듈을 가져와서 File 전송을 사용하여 app.log라는 파일에 메시지를 기록한다. 로거 구성의 transports 배열에 파일 전송을 추가한다.

로그 형식 사용자 지정

Winston은 로그 메시지 형식을 사용자 지정할 수 있는 몇 가지 옵션을 제공한다. 다음과 같이 타임스탬프를 포함하도록 로그 형식을 사용자 지정할 수 있다.

const { createLogger, format } = require('winston');
const { combine, timestamp, printf } = format;

const logger = createLogger({
level: 'info',
format: combine(
timestamp(),
printf(({ level, message, timestamp }) => {
return `${timestamp} [${level}]: ${message}`;
})
)
});

위의 코드에서는 Winston에서 format 모듈을 가져와서 로그 형식을 사용자 지정하는 데 사용한다. 각 로그 메시지에 timestamp 필드를 추가하고 printf 메서드를 사용하여 로그 메시지의 형식을 지정한다.

마무리

이 글에서는 Node.js 애플리케이션에서 로깅을 위해 Winston을 사용하는 기본 사항을 다뤘다. 기본 로거를 만드는 것으로 시작한 다음 메시지를 로깅하고 로거에 전송을 추가하는 방법을 언급했다. 마지막으로 특정 요구 사항에 맞게 로그 형식을 사용자 정의하는 방법에 대해 정리했다.

--

--

이상문

software developer working mainly in field of streaming, using C++, javascript