Node.js - लॉगिंग / उपयोग मॉर्गन और विनस्टन


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()) से जोड़ देगा ।


यह करने का क्या मतलब है, मेरा मतलब है, आपको भिखारी पर मॉर्गन की आवश्यकता क्यों थी, एक्सप्रेस के लिए सिर्फ एक वाइनस्टार मिडवेरे क्यों नहीं लिखा?
दिमित्री कोपरिवा

जवाबों:


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

यह विंस्टन को कंसोल के लिए लॉग लिखने के लिए और साथ ही एक फ़ाइल स्थापित करेगा। फिर आप मॉर्गन मिडलवेयर से विंस्टन में आउटपुट पास करने के लिए अंतिम अभिव्यक्ति का उपयोग कर सकते हैं।


क्या हम इस प्रक्रिया में टाइमस्टैम्प का उपयोग कर सकते हैं?
बमबारी

23
ऐसा प्रतीत नहीं होता है कि लकड़हारा को पार करना जरूरी है। मेरे मामले में, मैं करने में सक्षम थाapp.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
Devon Sams

17
यदि आप @ DevonSams की विधि का उपयोग कर रहे हैं, तो आपको लॉग इन लाइनों के बीच एक खाली लाइन मिलेगी क्योंकि मॉर्गन और वाइनस्टोन दोनों लॉग संदेश के अंत में एक लाइनब्रेक जोड़ रहे हैं। आप बस मैसेज से लाइनब्रेक को ट्रिम कर सकते हैंlogger.info(message.trim())
टिमो

2
क्या होगा अगर मैं logger.info के बजाय logger.error का उपयोग करना चाहता हूं, अगर सर्वर 500 के साथ प्रतिक्रिया करता है?
एलेंडॉर्फ

3
इसके बजाय के winston: ^3.0.0उपयोग winston.createLoggerके लिएnew winston.Logger
streof

21

टाइपस्क्रिप्ट में:

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

क्यों छोटे और संयुक्त नहीं?
एक

मैं अब और काम नहीं कर पा रहा था। ऐसा लगता है कि टाइपिंग गलत हैं। stackoverflow.com/questions/50048193/…
jpetitte

7

चेतावनी निकालने के लिए अंतिम पंक्ति को अपडेट करें

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

3

टाइपस्क्रिप्ट के लिए इसके बारे में जाने का एक और तरीका है, एक वर्ग बनाने की आवश्यकता के बिना

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

मॉर्गन को संदेश को समाप्त करने की बुरी आदत है \n इसलिए चीजों को व्यवस्थित करने के लिए आप इसे विंस्टन में लिखने से पहले हटाना चाहते हैं।

यह कई अलग-अलग तरीकों से किया जा सकता है जैसे कि विंस्टन में प्रारूप पक्ष पर, या लिखने के लिए अपनी स्ट्रीम को अपडेट करके \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.