LANGUAGE/NODEJS

[NODEJS] logger(morgan + winston)

보겸삼촌 2019. 8. 28. 11:31

- 개발환경

# 개발환경

os : windows10 Pro 64bit

tool : visual studio code

npm : v6.9.0

nodejs : v10.16.0

 

- 목적

 : 테스트 및 디버깅, 통계 등의 사용을 위해 로그를 남기기 위함

 

* 소스 디렉토리

# 소스 디렉토리

[ROOT]

  ㄴ app.js

  ㄴ [config]

     ㄴ dev.js

     ㄴ prod.js  

     ㄴ logger.js

  ㄴ [routes]

     ㄴ router1.js

     ㄴ router2.js

 

 

0. 사전준비

https://bogyum-uncle.tistory.com/69

불러오는 중입니다...

 

 

1. morgan 서드파티 모듈 설치

 

 

2.1. /appRoot/config/logger.js 

 

const winston = require('winston');
require('winston-daily-rotate-file');
require('date-utils');


const logger = winston.createLogger({
    level: 'info', // log level
    format: winston.format.json(),
    transports: [
        new winston.transports.DailyRotateFile({
            filename : 'log/system.log', // log 폴더에 system.log 이름으로 저장
            zippedArchive: true, // 압축여부
            //handleExceptions: true,
            //json: true,
            //maxsize: 5242880, //5MB
            //maxFiles: 5,
            //colorize: false,
            format: winston.format.printf(
                info => `${new Date().toFormat('YYYY-MM-DD HH24:MI:SS')} [${info.level.toUpperCase()}] - ${info.message}`)
            }),

        //콘솔 출력
        new winston.transports.Console({
            // level: 'debug',
            // handleExceptions: true,
            // json: false,
            colorize: true,
            format: winston.format.printf(
                info => `${new Date().toFormat('YYYY-MM-DD HH24:MI:SS')} [${info.level.toUpperCase()}] - ${info.message}`)
        })
    ],
    colorize: true,
    // exitOnError: false,
    humanReadableUnhandledException: true,
});

//운영중이지 않을 경우 콘솔에 출력 추가
// if (process.env.NODE_ENV !== 'production') {
//     new winston.transports.Console({
//         format: winston.format.printf(
//             info => `${new Date().toFormat('YYYY-MM-DD HH24:MI:SS')} [${info.level.toUpperCase()}] - ${info.message}`)
//     })
// }

module.exports = logger;
module.exports.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
}

 

  2.2. /appRoot/app.js 

 

//Express를 변수에 담기
var express = require("express");

//Express 호출 후 새로운 Express 애플리케이션을 변수(app)에 넣음
var app = express();

var http = require("http");
var path = require("path");

var logger = require('./config/logger');
app.use(require("morgan")("combined", {"stream": logger.stream}));

//path.resoleve : os에 따라 /public 혹은 \public 처럼 분리자가 다를 수 있지만 이 부분을 처리해 준다.
//__dirname : 현재 위치를 가리키는 node 전역변수
var publicPath = path.resolve(__dirname, "public");
app.use(express.static(publicPath));


/**
 *  Config 설정파일
 */
// let config;
// if(!process.env.NODE_ENV == 'dev'){
//     config = require('./config/dev');
// }else if(process.env.NODE_ENV == 'prod'){
//     config = require('./config/prod');
// }else{
//     config = require('./config/dev');
// }
//console.log(config.id);



/**
 * Routing 경로 설정
 * 
 * app.js에서 생성된 데이터를 사용하기 위해서 require에서 app이란 객체를 전달
 */
app.use('/r1', require('./routes/router1')(app));
app.use('/r2', require('./routes/router2')(app));
app.use(function(request, response){
    //4XX : 클라이언트 오류
    response.statusCode = 404;
    response.end("404 Error!");
});



app.listen(3000, function(){
    console.log("Server Running : 3000....!");
});

 

  : morgan 모듈 추가 및 winston과 morgan 컴바인

 

 

3. 확인