[NodeJS] 로그를 찍어보자(with tracer)

nakkim·2022년 5월 5일
0

로그를 출력하고 파일에 저장하는 것이 이번 목표이다.

tracer

A powerful and customizable logging library for node.js.

기능

  • 로그 메세지 출력

  • 출력 포맷 커스터마이징 가능

  • 로깅 레벨 정의 가능

  • add easily any transport?

  • 필터 기능 지원 → 컬러와 폰트 설정 가능

    https://www.npmjs.com/package/tracer

cls-rtracer

리퀘스트의 id를 생성해서 로그에 추가한다.

만약 리퀘스트가 X-Request-Id 헤더를 가지고 있으면, 그 값으로 대체한다.

리퀘스트 id에 액세스가 필요한 미들웨어 전에 추가한다.

 // any third party middleware that does not need access to request ids goes here
 // ...
 app.use(rTracer.expressMiddleware())
 // all code in middlewares, starting from here, has access to request ids

https://www.npmjs.com/package/cls-rtracer

처음에는 npm 페이지에 적힌 대로 작성했다.

콘솔에 출력 + 파일시스템 이용해서 출력 결과를 파일에 추가

import fs from 'fs';
import tracer from 'tracer';
import rTracer from 'cls-rtracer';

const logger = tracer.colorConsole({
  format: [
    '{{timestamp}} <{{title}}> ({{file}}:{{line}}) {{message}}', // default format
    {
      error:
        '{{timestamp}} <{{title}}> ({{file}}:{{line}}) {{message}}\nCall Stack:\n{{stack}}', // error format
    },
  ],
  dateformat: 'yyyy-mm-dd HH:MM:ss',
  transport: (data) => {
    console.log(data.output);
    fs.appendFile('./logs/server.log', `${rTracer.id()} ${data.rawoutput}\n`, (err) => {
      if (err) throw err;
    });
  },
});

export default logger;

콘솔 출력은 없이 파일로 저장만 하도록 코드를 수정했다.

import tracer from 'tracer';
import rTracer from 'cls-rtracer';

const logger_info = tracer.dailyfile({
  root: './logs',
  allLogsFileName: 'info', // [allLogsFileName].[날짜].log 파일에 추가
  format: '{{timestamp}} <{{title}}> ({{file}}:{{line}}) {{message}}',
  dateformat: 'yyyy-mm-dd HH:MM:ss',
});

const logger = {
  info(...trace: any[]) {
    return logger_info.info(rTracer.id(), ...trace);
  },
};

export default logger;

logger를 미들웨어에 추가하여 모든 요청에 대해 로그를 생성하게 했다.

import express from 'express';
import rTracer from 'cls-rtracer';

import logger from './logger';

...

app.use(rTracer.expressMiddleware());
app.use((req, res, next) => {
  const {
    method, path, url, query, headers: { cookie }, body,
  } = req;
  const request = {
    method, path, cookie, body, url, query
  };
  logger.info({ request });
  next();
});

...

로그는 아래와 같이 저장된다.

2021-11-28 15:04:39 <info> (logger.ts:13) 123a4ec0-5011-11ec-a958-099434299efc {
  request: {
    method: 'GET',
    path: '/user',
    cookie: undefined,
    body: {},
    url: '/user',
    query: {}
  }
}
2021-11-28 15:08:49 <info> (logger.ts:13) a7a901e0-5011-11ec-8bab-c7887cd33de4 {
  request: {
    method: 'GET',
    path: '/user',
    cookie: undefined,
    body: {},
    url: '/user',
    query: {},
    clientIp: '::ffff:127.0.0.1'
  }
}
  • [Error: ENOENT: no such file or directory, open ~] errno: -4058,
    code: 'ENOENT',
    syscall: 'open',
    path: ~ 이런 에러가 발생했따면... dailyfile의 root에 정의된 폴더가 존재하는지 확인! 없다면 생성합시다.
profile
nakkim.hashnode.dev로 이사합니다

0개의 댓글