ฉันต้องการเพิ่มการประทับเวลาลงในบันทึก วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คืออะไร?
ฉันต้องการเพิ่มการประทับเวลาลงในบันทึก วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คืออะไร?
คำตอบ:
ฉันกำลังจัดการกับปัญหาเดียวกันด้วยตัวเอง มีสองวิธีที่ฉันสามารถทำได้
เมื่อคุณรวม Winston โดยปกติจะเป็นค่าเริ่มต้นในการเพิ่มการขนส่งคอนโซล เพื่อให้การประทับเวลาทำงานในกรณีเริ่มต้นนี้ฉันจำเป็นต้อง:
ครั้งแรก:
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})
]
});
ตัวเลือกอื่น ๆ สำหรับการขนส่งคอนโซลมีอยู่ที่นี่ :
คำตอบข้างต้นไม่ได้ผลสำหรับฉัน ในกรณีที่คุณพยายามเพิ่มการประทับเวลาลงในบันทึกของคุณโดยใช้ Winston - 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 ()' เนื่องจากฉันต้องการการประทับเวลาในการขนส่งทั้งหมดของฉันฉันจึงเพิ่มตัวเลือกการจัดรูปแบบภายใน createLogger แทนที่จะอยู่ในการขนส่งแต่ละครั้ง ผลลัพธ์ของฉันบนคอนโซลและไฟล์ (activity.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
printf ดังต่อไปนี้ ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}
รวมถึงระดับการประทับเวลาและข้อความที่ฉันคิดว่าฉันสามารถลบได้
คุณสามารถใช้ในตัวutilและตลอดไปเพื่อให้บรรลุการเข้าสู่ระบบกับ timestap สำหรับเซิร์ฟเวอร์ nodejs ของคุณ เมื่อคุณเริ่มเซิร์ฟเวอร์เพิ่มเอาต์พุตบันทึกเป็นส่วนหนึ่งของพารามิเตอร์:
forever start -ao log/out.log server.js
จากนั้นคุณสามารถเขียน util ในเซิร์ฟเวอร์ของคุณ js
เซิร์ฟเวอร์ js
var util = require('util');
util.log("something with timestamp");
ผลลัพธ์จะมีลักษณะเช่นนี้สำหรับไฟล์ out.log:
out.log
15 Mar 15:09:28 - something with timestamp
util.error()
ข้ามการประทับเวลาเอาต์พุต
แม้ว่าฉันจะไม่ทราบถึง winston แต่นี่เป็นคำแนะนำ ฉันใช้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 ฉันมีโปรไฟล์การพัฒนาและการผลิต นอกจากนี้ยังมีประเภทคนตัดไม้เช่นตัวเพิ่มไฟล์แบบกลิ้ง, ตัวขยายคอนโซล ฯลฯ เนื่องจากส่วนเสริมในไฟล์บันทึกของคุณจะมีสีสันตามระดับการบันทึก [Trace, Info, Debug, Error, Fatal];)
log4js จะแทนที่ console.log ของคุณซึ่งตอนนี้เป็นพารามิเตอร์ที่กำหนดค่าได้ใน 0.5+
เราสามารถใช้ console-stamp เพื่อเพิ่ม timestamp และ log level ไปยังคอนโซลที่มีอยู่: require('console-stamp')(console, '[yyyy-mm-dd HH:MM:ss.l]')
ดูรายละเอียดhttps://github.com/starak/node-console-stamp
บางครั้งรูปแบบการประทับเวลาเริ่มต้นอาจไม่สะดวกสำหรับคุณ คุณสามารถลบล้างได้ด้วยการใช้งานของคุณ
แทน
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สำหรับรายละเอียด
ฉันรับคำตอบของ Biswadev และสร้างวัตถุ 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
อีกวิธีหนึ่งคือการรวมตัวบันทึกไว้ในไฟล์ที่ส่งออกฟังก์ชันบางอย่างเช่น 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
}
ไฟล์อะไรก็ได้ js
const logger = require('./services/loggerService')
logger.info('Hello World!')
log.log ของคุณ
{"timestamp":"2019-08-21 06:42:27","message":"Hello World!","level":"info"}