Node.js - günlük kaydı / morgan ve winston kullanma


102

morganhızlı dönüşümümüzü kaydetmek için kullanıyoruz :

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;
})

Ayrıca, winstondiğer günlük kayıtlarımızı kaydetmek için kullanırız:

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' })
  ]
});

İki kaydediciyi bir araya getirmenin bir yolu var mı? şu anki durum morgan, winstonyazdığı zaman benim standart çıktıma yazılmasıdır /var/log/log-file.log.

Logger dosyasının ekspres dönüşüm bilgilerinden ve istediğim diğer bilgilerden ( logger.info()) birleşmesini diliyorum ..


Bunu yapmanın anlamı nedir, demek istediğim, neden başlangıçta morgana ihtiyaç duydunuz, neden ifade için sadece bir winston ara metni yazmıyorsunuz?
Dimitri Kopriwa

Yanıtlar:


142

Bu makale, yapmak istedikleriniz için mükemmel bir iş çıkarıyor.

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

Özel kodunuz için muhtemelen şuna benzer bir şeye ihtiyacınız vardır:

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 }));

Bu, Winston'u konsola bir günlük ve bir dosya yazacak şekilde ayarlayacaktır. Ardından, morgan ara yazılımından çıkan çıktıyı winston'a geçirmek için son ifadeyi kullanabilirsiniz.


Bu süreçte bir zaman damgası kullanabilir miyiz?
bombayquant

25
Logger.stream'i geçersiz kılmak gerekli gibi görünmüyor .. Benim durumumda, yapabildimapp.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
Devon Sams

19
@ DevonSams'ın yöntemini kullanıyorsanız, kaydedilen satırlar arasında boş bir satır alırsınız çünkü hem morgan hem de winston günlüğe kaydedilen mesajın sonuna bir satır sonu ekliyor. Mesajdaki satır logger.info(message.trim())
Timo

2
Sunucu 500 ile yanıt verirse logger.info yerine logger.error kullanmak istersem ne olur?
Alendorff

3
İçin winston: ^3.0.0kullanım winston.createLoggeryerinenew winston.Logger
streof

21

Typescript'te:

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 }));

Neden küçük ve birleşik değil?
An-droid

Bunu artık çalıştıramadım. Yazılar yanlış gibi görünüyor. stackoverflow.com/questions/50048193/…
jpetitte

7

Uyarıyı kaldırmak için son satırı güncelleyin

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

3

Typescript için bir sınıf oluşturmaya gerek kalmadan yapmanın başka bir yolu da

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 }));

Bu çözüm bu Github sayfasından https://github.com/winstonjs/winston/issues/1385 alınmıştır . Bununla birlikte, kodlarımız arasında küçük bir fark olduğunu unutmamak önemlidir. Onun yerine:

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

Kullanırım:

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

Bu, sınıf oluşturma konusunda çok büyük olmadığım için bana yardımcı oldu.


2

Morgan'ın mesajı a ile bitirme gibi kötü bir alışkanlığı var, \nbu yüzden işleri daha düzenli hale getirmek için, onu winston'a yazmadan önce kaldırmak isteyebilirsiniz.

Bu, winston'daki format tarafında olduğu gibi veya akışınızı yazmayacak şekilde güncelleyerek birçok farklı şekilde yapılabilir. \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.