मैं लॉग में टाइमस्टैम्प जोड़ना चाहता हूं। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?
जवाबों:
मैं खुद उसी मुद्दे से निपट रहा था। दो तरीके हैं जो मैं यह करने में सक्षम था।
जब आप विंस्टन को शामिल करते हैं, तो यह आमतौर पर कंसोल ट्रांसपोर्ट को जोड़ने में चूक करता है। इस डिफ़ॉल्ट मामले में काम करने के लिए टाइमस्टैम्प प्राप्त करने के लिए, मुझे या तो इसकी आवश्यकता थी:
सबसे पहला:
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})
]
});
कंसोल परिवहन के कुछ अन्य विकल्प यहां देखे जा सकते हैं :
ऊपर के जवाब मेरे काम नहीं आए। यदि आप विंस्टन - 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'})
हम ऐसा भी कर सकते हैं
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
लॉग संदेश में शामिल नहीं हो सकता ।
someObject
निम्नलिखित प्रिंटफ स्टेटमेंट का उपयोग करके शामिल करने में सक्षम था ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}
। इसमें स्तर, टाइमस्टैम्प और संदेश शामिल हैं जो मुझे लगता है कि मैं हटा सकता हूं।
आप अंतर्निहित उपयोग कर सकते हैं 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
util.error()
आउटपुट टाइमस्टैम्पिंग को छोड़ देता है।
हालांकि मुझे विंसटन के बारे में पता नहीं है, यह एक सुझाव है। मैं इस तरह डिफ़ॉल्ट रूप से लॉगिंग और मेरे लॉग के लिए 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+ में अब एक कॉन्फ़िगर करने योग्य पैरामीटर है
कभी-कभी डिफ़ॉल्ट टाइमस्टैम्प प्रारूप आपके लिए सुविधाजनक नहीं हो सकता है। आप इसे अपने कार्यान्वयन के साथ ओवरराइड कर सकते हैं।
के बजाय
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 देखें
हम टाइमस्टैम्प को जोड़ने और मौजूदा कंसोल में लॉग स्तर के लिए कंसोल-स्टैम्प का उपयोग कर सकते हैं: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
विवरण के लिए https://github.com/starak/node-console-stamp देखें
एक अन्य समाधान लकड़हारे को एक फाइल में लपेट रहा है जो कुछ कार्यों जैसे कि 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"}
मैंने बिस्वदेव का उत्तर लिया और एक कठोर 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