로그를 출력하고 파일에 저장하는 것이 이번 목표이다.
A powerful and customizable logging library for node.js.
로그 메세지 출력
출력 포맷 커스터마이징 가능
로깅 레벨 정의 가능
add easily any transport?
필터 기능 지원 → 컬러와 폰트 설정 가능
리퀘스트의 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'
}
}