본문 바로가기
더이상 하지 않는 망한 프로젝트/프로젝트 개발 과정

[앱삼] 2. MERN 풀스택 환경 기본세팅 - 3

by VictorMeredith 2023. 2. 26.

<세팅목록>

1. 디렉토리/파일목록 세팅

2. Git 세팅

3. 라이브러리 세팅

4. node서버와 react 연결, 프록시 개발환경 설정 

5. 디렉토리에 따른 코드스플리팅과 라우터설계 

6. DB세팅 

7. 로그세팅 // 여기

8. 에러핸들러 미들웨어 세팅

9. 쿠키파서/서드파티 미들웨어 세팅

... 

 

1. 로그세팅

- 메인 로직 이외에 도움을 주는 미들웨어 중 request 로그를 저장하는 시스템을 구축해보자.

 

/middleware/logger.js

const { format } = require('date-fns');
const { v4 : uuid } = require('uuid');
const fs = require('fs');
const fsPromises = require('fs').promises;
const path = require('path');

const logEvents = async (message, logFileName)=>{
    const dateTime = `${format(new Date(), 'yyyyMMdd\tHH:mm:ss')}`
    const logItem = `${dateTime}\t${uuid()}\t${message}\n`

    try {
        if(!fs.existsSync(path.join(__dirname, '..', 'logs'))){ //logs 폴더가 존재하지 않으면
            await fsPromises.mkdir(path.join(__dirname, '..', 'logs'))
        }
        await fsPromises.appendFile(path.join(__dirname, '..', 'logs', logFileName), logItem);
    }
    catch(err){
        console.log(err)
    }
}

const logger = (req, res, next)=>{
    logEvents(`${req.method}\t${req.url}\t${req.headers.origin}`, 'reqLog.log');
    console.log(`${req.method} ${req.path}`);
    next();
}

module.exports = {logEvents, logger}

- 사실 별거 없다. logEvents 모듈은 logs폴더가 없으면 logFileName인자를 받아서 새로 만들고, 그 안에 로그 내용을 적는거다.

- next()는 미들웨어 끝났으니 다음걸로 넘기세요~ 의미이다.

- 모듈을 exports 해주고

 

/backend/app.js

//... 
const { logger } = require('./middleware/logger');

// body-parser setting (4.16버전 이상 express에 내장되었다.)
app.use(express.json());
app.use(express.urlencoded({extended: false}));

//...

app.use(logger);

app.use(express.static(path.join(__dirname, 'public'))) // static path 미들웨어 

//...

- 위에서 require 해주고

- app.use(logger); 로 사용하면 된다.

- 위치가 중요하다 어떤 미들웨어가 먼저 튀어나갈지 순서대로 결정되니까.

- 그리고 전 파트에서 body-parser로 파싱했던 json 미들웨어는 express 4.16 이상 버전부터 express에 내장되었다고 한다. 그래서 바꿔봤다.

- 저장하고 4000포트로 접속해주면

로그가 엄청 많이 뜬다. 요청한 내역이 다뜬다.

그리고 나서

reqLog.log가 생겼다.

내부를 살펴보면

날짜, 시간, uuid, 요청형식 등 기록이 잘 되었다.

- 다음은 에러를 핸들링 해보자~

댓글