[Node.js] winston custom level 추가하기


Node.js의 라이브러리인 winston 을 이용하면 로그를 저장하는걸 간편하게 구현할 수 있습니다.

winston 은 level 이라는 개념으로 로그 우선순위를 관리하는데 로그 level은 아래와 같습니다.

 

{ error: 0 , warn: 1 , info: 2 , http: 3 , verbose: 4 , debug: 5 , silly: 6 }

숫자가 낮을 수록 우선순위가 높으며, error이 가장 위험한 로그라고 보시면 됩니다.

winston 은 이러한 level로 로그를 저장하며 특정 level 을 설정해놓고 그 level에 맞춰서 로그를 저장하라고 파일에 지시해주면 그 로그만을 저장하는게 아니라 숫자가 같거나 낮은 로그까지 한꺼번에 저장하게 됩니다.

 

예를 들어서 level : info 로 설정하고 로그를 저장하게 시키면 info level의 로그만 저장하는게 아니라 info 를 포함하여 숫자가 더 낮은 (더 우선순위가 높고 중요한) error, warn 까지 저장을 합니다.

 

level : error 로 저장을 지시하면 error 보다 낮은 숫자는 없기에 error만 저장되게 됩니다.

 

어쨌던 위 처럼 기본 level 로 사용하는게 마음에 안드는 분들이 있을겁니다. 

이럴땐 custom level 을 사용해서 level 을 따로 정의해서 사용할 수 있습니다.

 

Custom Level 정의하기

설정파일 (winston.js) 로 이동해서 수정을 진행합니다.

저의 경우 설정 파일은 해당 블로그 글을 참고했습니다.

 

const custom_level = {
  levels: {
    error: 0,
    sms: 1,
    info: 2,
    http: 3,
    verbose: 4,
    debug: 5,
    silly: 6,
  },
  colors: {
    sms: "yellow",
  },
};

상단에 custom_level 이라는 객체를 만들고 levels 에 커스텀 level을 정의합니다.

또 colors 에는 커스텀으로 정의한 내용을 출력할 때 무슨색으로 콘솔에 출력할지 정합니다.

 

아까도 말했듯이 winston의 기본 level 은 아래와 같은데

{ error: 0 , warn: 1 , info: 2 , http: 3 , verbose: 4 , debug: 5 , silly: 6 }

저는 저기서 warn 이라는 부분을 sms 라는 내용으로 바꿨습니다.

 

기본적으로 기본 6개 level은 색이 이미 정해져있어서 colors 에는 제가 이번에 새로 정의한 sms만 색을 적어주시면 됩니다. 만약에 기본 6개의 level 색을 변경하고 싶으면 저기 colors 에 재정의 해주면 아마 될 거 같습니다. (안해봐서 모름)

 

새로 추가한 커스텀 level 의 경우 저렇게 색 코드를 꼭 지정해주셔야 합니다. 귀찮다고 안하면 색값이 없다고 로그 작성할 때 튕겨버림.

 

const winston = require("winston");

winston.addColors(custom_level.colors);

가져온 winston 라이브러리에서 addColors() 를 통해 방금 추가한 커스텀 level의 색 코드를 추가합니다.

 

const logger = winston.createLogger({
  format: combine(
    timestamp({
      format: "YYYY-MM-DD HH:mm:ss",
    }),
    logFormat
  ),
  levels: custom_level.levels, //커스텀 레벨 설정 (이 부분)
  .
  .
  .

winston.createLogger 안에서 levels: custom_level.levels 를 추가해서 방금 추가한 커스텀 level을 추가합니다.

나머지 파일을 저장하는 규칙에서도 sms 라는 level의 이름으로 설정을 하면 됩니다.

 

사용할땐 logger.sms() 와 같은 형태로 호출하면 잘 저장되는걸 볼 수 있습니다!

COMMENT WRITE