Node.js

[Nodejs] Winston모듈이용하여 로그파일 생성 및 설정, httpd로그도 파일에 저장되게하기

IT로로 2019. 5. 14. 15:56

1. npm install --save -y winston  winston-daily-rotate-file :  모듈설치 

** log 파일 경로 지정하기 위해 app-root-path 모듈을 이용했다.(npm install --save app-root-path 필요) 리눅스일 경우

 

winston.js

var winstonDaily = require('winston-daily-rotate-file');


const { createLogger, format, transports } = require('winston');                                                                     // 한번에 여러개의 객체를 한번에 만든다. 모든 변수가 winston관련 모듈을 불러온다


// const { combine, timestamp, printf } = format;                                                                //  format.combine,  format.timestamp,  format.printf 이런것들이 귀찮으면  상단처럼 정의하고 코드에는 format을 제외해도 된다. 지금은 format을 붙여 호출

const logger = createLogger({                                                                                                        //  winston모듈에서 createLogger를 생성하여 logger생성 (3버젼이 되면서 winston.createLogger로는 error가 뜬다.)


// const logger = new (winston.createLogger)({                                                  //  "winston.Logger is not a constructor"  에러뜨는 이유는 상단에서 객체를 생성했기 때문

// const logger = new (winston.Logger)({                                                            //  "winston.Logger is not a constructor"  에러뜨는 이유는 상단에서 객체를 생성했기 때문
        transports: [
            new (winstonDaily)({  // 로그파일 생성에 관한 설정
                name: 'info-file',
                filename: `log/testserver01-%DATE%.log`,  // %DATE% 이부분이 날짜로 변경, 경로를지정,
                colorize: false,
                zippedArchive: true,
                maxSize: "20m",
                maxFiles: "1000",
                level: "info",
                format: format.combine(  // 관련설정 포멧을 설정
                    format.label({ label: 'testserver01' }), // 라벨을 정의(서버호스트명으로 많이사용)
                    // format.colorize(), // 파일에서는 이게 있으면 색상이 변경되는게 아니고 색상의 문자열이 나타난다.
                    format.timestamp({    // 시간의 형식을 정의
                        format: "YYYY-MM-DD HH:mm:ss"
                    }),
                    format.printf(   // 파일안에 로그의 형식을 정의
                        info => `{"${info.timestamp}"  "[${info.label}]"  "${info.level}"  "${info.message}"}`
                    )
                ),
                showlevel: true,
                json: false,
            }),
        new (transports.Console)({
            name: 'debug-console',
            colorize: true,
            level: "debug",
            format: format.combine(
                    format.label({ label: 'docker-crzwas01' }),
                    format.colorize(),
                    format.timestamp({
                    format: "YYYY-MM-DD HH:mm:ss"
                }),
                    format.printf(
                        info => `{"${info.timestamp}"  "[${info.label}]"  "${info.level}"  "${info.message}"}`
                    )
            ),
            showlevel: true,
            json: false,
        })
            ]
    });


logger.stream = {    // httpd log  출력하기
    write: function(message, encoding) {
        logger.info(message); // 단순히 message를 default 포맷으로 출력
    },
};
 
module.exports = logger;  // 외부에서 해당 파일을 호출할수 있게 모듈화

 

 

2. npm install --save -y morgan :  httpd 로그 관련 모듈설치 

 

app.js

var morgan = require('morgan');

var logger = require('./router/winston');

app.use(bodyparser.json());
app.use(morgan('combined', {stream: logger.stream})); // morgan http로그 미들웨어 추가


app.listen(3004, function () {
    logger.info('server 3004번 포트로 시작됨')  // 콘솔 및 로그파일에 찍힘
});

 

 

결과

./log/testserver01-2019-05-14.log 파일생성 및 내용

{"2019-05-14 15:51:14"  "[dockercrzwas01]"  "info"  "::ffff:192.168.0.37 - - [14/May/2019:06:51:14 +0000] "GET /list/1 HTTP/1.1" 200 9746 "http://192.168.0.37:3004/auth/login" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
"}


{"2019-05-14 15:51:34"  "[docker-testserver01]"  "info"  "server 3004번 포트로 시작됨"}