मैं Node.js लाइब्रेरी विंस्टन का उपयोग करके लॉग में टाइमस्टैम्प कैसे जोड़ सकता हूं?


93

मैं लॉग में टाइमस्टैम्प जोड़ना चाहता हूं। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?


यह बहुत व्यापक है क्योंकि आप इसे क्लाइंट मशीन से नहीं कर सकते।
जोशुआ

जवाबों:


112

मैं खुद उसी मुद्दे से निपट रहा था। दो तरीके हैं जो मैं यह करने में सक्षम था।

जब आप विंस्टन को शामिल करते हैं, तो यह आमतौर पर कंसोल ट्रांसपोर्ट को जोड़ने में चूक करता है। इस डिफ़ॉल्ट मामले में काम करने के लिए टाइमस्टैम्प प्राप्त करने के लिए, मुझे या तो इसकी आवश्यकता थी:

  1. कंसोल ट्रांसपोर्ट निकालें और टाइमस्टैम्प विकल्प के साथ फिर से जोड़ें।
  2. सही करने के लिए सेट टाइमस्टैम्प विकल्प के साथ अपना स्वयं का लकड़हारा ऑब्जेक्ट बनाएं।

सबसे पहला:

var winston = require('winston');
winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'timestamp':true});

दूसरा, और क्लीनर विकल्प:

var winston = require('winston');
var logger = new (winston.Logger)({
    transports: [
      new (winston.transports.Console)({'timestamp':true})
    ]
});

कंसोल परिवहन के कुछ अन्य विकल्प यहां देखे जा सकते हैं :

  • स्तर: संदेशों का स्तर जो इस परिवहन को लॉग इन करना चाहिए (डिफ़ॉल्ट 'डीबग')।
  • मौन: बूलियन ध्वज यह दर्शाता है कि आउटपुट (डिफ़ॉल्ट झूठा) को दबाने के लिए।
  • colorize: बूलियन फ्लैग यह दर्शाता है कि क्या हमें आउटपुट (डिफ़ॉल्ट गलत) को कलर करना चाहिए।
  • टाइमस्टैम्प: बूलियन ध्वज यह दर्शाता है कि क्या हमें टाइमस्टैम्प (डिफ़ॉल्ट झूठा) के साथ आउटपुट तैयार करना चाहिए। यदि फ़ंक्शन निर्दिष्ट किया गया है, तो इसकी वापसी मूल्य का उपयोग टाइमस्टैम्प के बजाय किया जाएगा।

1
एक ही समय में अद्भुत और सरल। धन्यवाद!
कोली

7
यह भी खूब रही। मैं आमतौर पर इसे एक समर्पित फ़ाइल में लपेटता हूं ताकि मैं किसी भी फ़ाइल से अपने कॉन्फ़िगर किए गए लकड़हारे को आसानी से प्राप्त कर सकूं, अर्थात, मैंने उपरोक्त कोड (विकल्प 2) को एक नई फ़ाइल logger.js में डाल दिया, इसके बाद मॉड्यूल.एक्सपोर्ट = लकड़हारा; फिर किसी भी फाइल से मैं var logger = आवश्यकता ('./ logger.js') करता हूं और फिर किसी भी फाइल से logger.info ('हैलो') कर सकता हूं और विंस्टन का समान कॉन्फ़िगरेशन प्राप्त कर सकता हूं।
जेएचएच

TypeError: (इंटरमीडिएट वैल्यू) एक फंक्शन नहीं है
Urasquirrel

81

ऊपर के जवाब मेरे काम नहीं आए। यदि आप विंस्टन - 3.0.0-rc1 के नवीनतम संस्करण का उपयोग करके अपने लॉग में टाइमस्टैम्प को जोड़ने का प्रयास कर रहे हैं, तो यह आकर्षक है:

    const {transports, createLogger, format} = require('winston');

    const logger = createLogger({
        format: format.combine(
            format.timestamp(),
            format.json()
        ),
        transports: [
            new transports.Console(),
            new transports.File({filename: 'logs/error/error.log', level: 'error'}),
            new transports.File({filename: 'logs/activity/activity.log', level:'info'})
        ]
    });

मैंने 'format.combine ()' का उपयोग किया। चूँकि मुझे अपने सभी ट्रांसपोर्ट पर टाइमस्टैम्प की आवश्यकता थी, इसलिए मैंने प्रत्येक परिवहन के बजाय क्रिएटलेगर के भीतर प्रारूपण विकल्प जोड़ा। कंसोल पर और फ़ाइल (गतिविधि.log) पर मेरा आउटपुट निम्नानुसार हैं:

{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}
{"message":"Connected to mongodb","level":"info","timestamp":"2018-02-01T22:35:27.758Z"}

हम इस टाइमस्टैम्प को 'format.combine ()' में हमेशा की तरह उपयोग करके जोड़ सकते हैं:

format.timestamp({format:'MM-YY-DD'})

14

हम ऐसा भी कर सकते हैं

var winston = require('winston');
const { createLogger, format, transports } = require('winston');
var config = require('../configurations/envconfig.js');

var loggerLevel = process.env.LOGGERLEVEL ||  config.get('LOGGERLEVEL');

var logger = winston.createLogger({
  format: format.combine(
    format.timestamp({
      format: 'YYYY-MM-DD HH:mm:ss'
    }),
    format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`+(info.splat!==undefined?`${info.splat}`:" "))
  ),
  transports: [
    new (winston.transports.Console)({ level: loggerLevel }),
  ]
});
module.exports = logger;

क्या यह भी काम करता है logger.info('Message', someObject)? मैंने संयोजन का उपयोग करके एक कस्टम प्रारूप सेटअप किया है और मैं someObjectलॉग संदेश में शामिल नहीं हो सकता ।
SomethingOn

1
मैं someObjectनिम्नलिखित प्रिंटफ स्टेटमेंट का उपयोग करके शामिल करने में सक्षम था ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}। इसमें स्तर, टाइमस्टैम्प और संदेश शामिल हैं जो मुझे लगता है कि मैं हटा सकता हूं।
कुछ

9

आप अंतर्निहित उपयोग कर सकते हैं util और हमेशा के लिए अपने NodeJS सर्वर के लिए timestap साथ प्रवेश प्राप्त करने के लिए। जब आप सर्वर शुरू करते हैं तो पैरामीटर के भाग के रूप में लॉग आउटपुट जोड़ें:

forever start -ao log/out.log server.js

और फिर आप अपने server.js में उपयोग लिख सकते हैं

server.js

var util = require('util');
util.log("something with timestamp");

आउटपुट कुछ इस तरह दिखेगा। out.log फ़ाइल:

out.log

15 Mar 15:09:28 - something with timestamp

1
दुर्भाग्य से, util.error()आउटपुट टाइमस्टैम्पिंग को छोड़ देता है।
सरन

4

हालांकि मुझे विंसटन के बारे में पता नहीं है, यह एक सुझाव है। मैं इस तरह डिफ़ॉल्ट रूप से लॉगिंग और मेरे लॉग के लिए log4js का उपयोग करता हूं

[2012-04-23 16:36:02.965] [INFO] Development - Node Application is running on port 8090
[2012-04-23 16:36:02.966] [FATAL] Development - Connection Terminated to  '127.0.0.1' '6379'

विकास मेरी नोड प्रक्रिया का वातावरण है और [INFO | FATAL] लॉग स्तर है

लॉगिंग के लिए अलग-अलग प्रोफाइल बनाए रखना log4js में संभव है। मेरे पास विकास और उत्पादन प्रोफ़ाइल हैं। इसके अलावा लॉगर प्रकार हैं जैसे रोलिंग फ़ाइल ऐपेंडर, कंसोल ऐपेंडर, आदि। एडऑन के रूप में आपकी लॉग फाइलें लॉग स्तर के आधार पर रंगीन होंगी [ट्रेस, जानकारी, डीबग, त्रुटि, घातक];)

log4js आपके कंसोल को ओवरराइड करेगा। यह 0.5+ में अब एक कॉन्फ़िगर करने योग्य पैरामीटर है


FYI करें: log4js- नोड (0.5+) के नए संस्करण सांत्वना को स्वचालित रूप से ओवरराइड नहीं करते हैं।
जेफ हिल्टज

@ जफ्फिल्ट्ज़ हां आप सही हैं :) अब यह एक विन्यास योग्य पैरामीटर है
तमिल

2

कभी-कभी डिफ़ॉल्ट टाइमस्टैम्प प्रारूप आपके लिए सुविधाजनक नहीं हो सकता है। आप इसे अपने कार्यान्वयन के साथ ओवरराइड कर सकते हैं।

के बजाय

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({'timestamp':true})
]
});

तुम लिख सकते हो

var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
  new (winston.transports.Console)({
     'timestamp': function() {
        return <write your custom formatted date here>;
     }
  })
]
});

विवरण के लिए https://github.com/winstonjs/winston#custom-log-format देखें


2

हम टाइमस्टैम्प को जोड़ने और मौजूदा कंसोल में लॉग स्तर के लिए कंसोल-स्टैम्प का उपयोग कर सकते हैं: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')

विवरण के लिए https://github.com/starak/node-console-stamp देखें


0

एक अन्य समाधान लकड़हारे को एक फाइल में लपेट रहा है जो कुछ कार्यों जैसे कि logger.info (), logger.error (), इत्यादि को निर्यात करता है, फिर आप हर संदेश लॉग पर भेजे जाने के लिए एक अतिरिक्त कुंजी पास करते हैं।

loggerService.js

const logger = winston.createLogger({ ... })

function handleLog(message, level) {
  const logData = {
    timestamp: Date.now(),
    message,
  }

  return logger[level](logData)
}

function info(message) {
  handleLog(message, 'info')
}

function error(message) {
  handleLog(message, 'error')
}

function warn(message) {
  handleLog(message, 'warn')
}

module.exports = {
  info,
  error,
  warn
}

जो कुछ-file.js

const logger = require('./services/loggerService')

logger.info('Hello World!')

अपने-log.log

{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}

0

मैंने बिस्वदेव का उत्तर लिया और एक कठोर JSON ऑब्जेक्ट बनाया। इस तरह अगर मुझे बाद में लॉग को संसाधित करने की आवश्यकता है तो यह एक अच्छी तरह से संरचित प्रारूप में होगा।

const winston = require('winston');
const { createLogger, format, transports } = require('winston');

const dotenv = require('dotenv');
dotenv.config();

var logger = createLogger({
    level: 'info',
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD HH:mm:ss',
        }),
        format.printf((info) =>
            JSON.stringify({
                t: info.timestamp,
                l: info.level,
                m: info.message,
                s: info.splat !== undefined ? `${info.splat}` : '',
            }) + ','
        )
    ),
});

if (process.env.NODE_ENV !== 'PRODUCTION') {
    logger.add(new transports.Console({ format: winston.format.cli() }));

    // Turn these on to create logs as if it were production
    // logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
    // logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
    // logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
} else {
    logger.add(new transports.File({ filename: 'log/output/error.log', level: 'error' }));
    logger.add(new transports.File({ filename: 'log/output/warn.log', level: 'warn' }));
    logger.add(new transports.File({ filename: 'log/output/info.log', level: 'info' }));
}

module.exports = {
    logger,
};

उपयोग:

app.listen(port, () => logger.info(`app is running on port ${port}`));

आउटपुट:

info.log फ़ाइल:

{"t":"2020-08-06 08:02:05","l":"info","m":"app is running on port 3001","s":""},

कंसोल:

info:    app is running on port 3001
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.