Node.js-로깅 / Morgan 및 Winston 사용


99

우리는 morgan표현 변환을 기록하기 위해 사용합니다 :

var morgan  = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
  return req.method + ' ' + req.url + ' ' + req.uuid;
})

또한 winston다른 로깅을 기록하기 위해 다음을 사용합니다 .

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
         new (winston.transports.Console)({ level: 'info' }),
          new (winston.transports.File)({ filename: '/var/log/log-file.log' })
  ]
});

두 로거를 결합하는 방법이 있습니까? 이제 상황은 morgan내 표준 출력에 winston쓸 때 /var/log/log-file.log.

로거 파일이 익스프레스 변환 정보와 내가 원하는 다른 정보 ( logger.info()) 에서 결합되기를 바랍니다 .


이 일의 요점은 무엇입니까, 내 말은, 왜 당신은 시작에서 모건이 필요 했습니까? 왜 급행을 위해 윈스턴 미들 레어를 쓰지 않습니까?
Dimitri Kopriwa

답변:


141

이 기사는 당신이하고 싶은 일에 대해 훌륭한 일을합니다.

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

특정 코드의 경우 다음과 같은 것이 필요할 수 있습니다.

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
});

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

app.use(require("morgan")("combined", { "stream": logger.stream }));

그러면 Winston이 콘솔과 파일에 로그를 기록하도록 설정됩니다. 그런 다음 마지막 표현식을 사용하여 morgan 미들웨어의 출력을 winston으로 전달할 수 있습니다.


이 프로세스에서 타임 스탬프를 사용할 수 있습니까?
bombayquant

23
logger.stream을 재정의 할 필요가없는 것 같습니다. 제 경우에는 할 수있었습니다app.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
Devon Sams

17
@DevonSams의 방법을 사용하는 경우 morgan과 winston이 기록 된 메시지 끝에 줄 바꿈을 추가하기 때문에 기록 된 줄 사이에 빈 줄이 표시됩니다. 다음과 같이 메시지에서 줄 바꿈을 간단히 잘라낼 수 있습니다logger.info(message.trim())
Timo

2
서버가 500으로 응답하면 logger.info 대신 logger.error를 사용하려면 어떻게해야합니까?
Alendorff

3
위해 winston: ^3.0.0사용 winston.createLogger대신에new winston.Logger
streof

21

Typescript에서 :

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));

왜 작고 결합되지 않습니까?
An-droid

나는 이것을 더 이상 작동시킬 수 없었다. 타이핑이 잘못된 것 같습니다. stackoverflow.com/questions/50048193/…
jpetitte

7

경고를 제거하려면 마지막 줄을 업데이트하십시오.

app.use(require("morgan")("combined", { stream: logger.stream }));

3

Typescript의 경우 클래스를 만들 필요없이 다른 방법으로

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

이 솔루션은이 Github 페이지 https://github.com/winstonjs/winston/issues/1385에서 확인되었습니다 . 그러나 코드간에 약간의 차이가 있다는 점에 유의하는 것이 중요합니다. 대신에:

app.use(morgan('combined', { myStream }));

나는 사용한다:

app.use(morgan('combined', { stream: myStream }));

이것은 수업을 만드는 데 너무 크지 않기 때문에 나를 도왔습니다.


1

Morgan은 메시지 \n를 정리하기 위해 메시지를 끝내는 나쁜 습관을 가지고 있습니다. winston에 쓰기 전에 제거하는 것이 좋습니다.

이것은 winston의 형식 측면에서와 같이 다양한 방법으로 수행하거나 스트림을 업데이트하여 \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.