ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • express) Winston로 Log 관리하기
    express 2024. 1. 5. 21:44

     

    winston: 로그 파일 및 로그레벨 관리모듈

     

    winston-daily-rotate-file : 매일 날짜별로 로그 파일 생성 및 관리 모듈 

     

     

     

     

     

     

     

    winston 모듈을 쓰는이유)

     

    ㄴwinston은 개발환경보다 배포환경에서 로그를 남기기위해 사용한다.

     

    ㄴ배포환경은 개발환경과 달리 콘솔창을 확인하기 어렵고, 서버가 재부팅되면 기록이 초기화돼서 보기어렵다

     

    ㄴ그래서 로그나 에러가 발생했을때, 외부파일에 로그기록을 보관하기 위해 사용한다.

     

     

     

    mongoDB 연결)

     
    const mongoose = require("mongoose");

    const uri = "mongodb://localhost:포트번호/db명";
    mongoose.connect(uri, { useUnifiedTopology: true } )

    const mongoDB = mongoose.connection

    mongoDB.on("error", () => {
        console.log('mongoDB connect Failed');
    })

    mongoDB.on("open", () => {
        console.log('mongoDB connected!');
    })

    const logSchema = new mongoose.Schema({
        url: { type: String, required: true },
        timestamp: {
                    type: Date,
                    required: true,
                    default: Date.now
        }
    })

    const winstonLog = mongoose.model('winston_log', logSchema); // 복수형 winston_logs의 컬렉션에 데이터 삽입
     ** model()의 첫번째 매개변수인 컬렉션명이 대문자를 소문자로 바꾸고, 뒤에 s가 붙은 이름의 컬렉션을 이용한다는 점 주의하기 !!
     
     
     
    module.exports = {
        winstonLog
    }

     

     

     

     

     

     

     

    logger.js

     
     
    const { createLogger, transports, format } = require("winston");
    const { combine, timestamp, label, metadata, prettyPrint } = format//format 내에서도 필요한 기능 구조분해
    const MongoDB = require('winston-mongodb').MongoDB;

    //로그 출력 형식 만들기. combine()으로 다양한 형식을 합친다
    // label 로 추가할 문자열삽입
    // prettyPrint()로 가독성좋게 출력
    const printLogFormat = combine(  
        timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
        label({ label: '블로그 어플리케이션' }),
        prettyPrint()
    )

    // metadata()로, 기본정보이외에 추가정보도 로그에 삽입한다.
    const logger = createLogger({
        transports: [
            new MongoDB({
                db: 'mongodb://localhost:27017/project',
                collection: 'winston_logs',
                format: combine(
                    timestamp({ format: 'YYYY-MM-DD HH:mm:ss'}),
                    metadata()
                   
                ),
            })
        ]
    })

    if (process.env.NODE_ENV !== "production") { //실제 서비스 서버인지, 개발용 서버인지 구분하여 콘솔에 출력. 어느 서버에 출력하는 것인지?
        logger.add(
            new transports.Console({
                level: 'info',
                format: printLogFormat
            })
        )
    }


    module.exports = logger;
     
     

     

     

     

     

    server.js

    //winston 로깅
    app.use((req, res, next) => {

        const logInfo = {
            method: req.method,
            route: req.url,
            userIP: req.ip,
            userID: req.session.userID || null,
            request: req.body || {},
            response: res.body || {},
        }

        logger.info('API 요청',  logInfo );
        next();
    })
     

     

     

     

     

     

    저장되는는 로그)

     {
                "_id": "659e8ed12c86e2d0abc3ec29",
                "timestamp": "2024-01-10T12:34:25.525Z",
                "level": "info",
                "message": "API 요청",
                "meta": {
                    "method": "GET",
                    "route": "/log",
                    "userIP": "211.207.13.52",
                    "userID": null,
                    "timestamp": "2024-01-10 12:34:25"
                }

     

     

    ㄴ 다만 timestamp를 정해진 형식으로 하나만 넣고 싶은데, 기본값으로 들어가는 값인 timestamp, level, message조정하

     

    는 법은 몰라서 실패했다..

     

     

    ㄴ그리고 response를 받아오는 법도 아직은 잘 모르겠다.. 

    'express' 카테고리의 다른 글

    express) 세션 secret옵션, dotenv 환경변수 이용하기  (0) 2023.12.18
Designed by Tistory.