ฉันจะเพิ่มการประทับเวลาลงในบันทึกโดยใช้ไลบรารี Node.js Winston ได้อย่างไร


94

ฉันต้องการเพิ่มการประทับเวลาลงในบันทึก วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คืออะไร?


สิ่งนี้ยังคงกว้างเกินไปเนื่องจากคุณไม่สามารถทำได้จากเครื่องไคลเอนต์
Joshua

คำตอบ:


113

ฉันกำลังจัดการกับปัญหาเดียวกันด้วยตัวเอง มีสองวิธีที่ฉันสามารถทำได้

เมื่อคุณรวม Winston โดยปกติจะเป็นค่าเริ่มต้นในการเพิ่มการขนส่งคอนโซล เพื่อให้การประทับเวลาทำงานในกรณีเริ่มต้นนี้ฉันจำเป็นต้อง:

  1. ลบคอนโซลการขนส่งและเพิ่มอีกครั้งด้วยตัวเลือกการประทับเวลา
  2. สร้างวัตถุ Logger ของคุณเองโดยตั้งค่าตัวเลือกการประทับเวลาเป็นจริง

ครั้งแรก:

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

ตัวเลือกอื่น ๆ สำหรับการขนส่งคอนโซลมีอยู่ที่นี่ :

  • ระดับ: ระดับของข้อความที่การขนส่งนี้ควรบันทึก (ค่าเริ่มต้น 'debug')
  • เงียบ: แฟล็กบูลีนที่ระบุว่าจะระงับเอาต์พุต (ค่าเริ่มต้นเท็จ) หรือไม่
  • colorize: Boolean flag ระบุว่าเราควร colorize output (default false)
  • การประทับเวลา: แฟล็กบูลีนที่ระบุว่าเราควรนำหน้าผลลัพธ์ด้วยการประทับเวลา (ค่าเริ่มต้นเท็จ) หากระบุฟังก์ชันระบบจะใช้ค่าส่งคืนแทนการประทับเวลา

1
น่าทึ่งและเรียบง่ายในเวลาเดียวกัน ขอขอบคุณ!
kolrie

7
นี่มันเยี่ยมมาก ฉันมักจะรวมสิ่งนี้ไว้ในไฟล์เฉพาะเพื่อให้ฉันสามารถรับตัวบันทึกที่กำหนดค่าไว้ได้อย่างง่ายดายจากไฟล์ใด ๆ เช่นฉันใส่รหัสด้านบน (ตัวเลือก 2) ในไฟล์ใหม่ logger.js ตามด้วย module.exports = logger; จากไฟล์ใด ๆ ฉันทำ var logger = ต้องใช้ ('./ logger.js') จากนั้นสามารถทำ logger.info ('hello') จากไฟล์ใดก็ได้และได้รับการกำหนดค่าเดียวกันของ Winston
JHH

TypeError: (ค่ากลาง) ไม่ใช่ฟังก์ชัน
Urasquirrel

85

คำตอบข้างต้นไม่ได้ผลสำหรับฉัน ในกรณีที่คุณพยายามเพิ่มการประทับเวลาลงในบันทึกของคุณโดยใช้ 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'})

17

เราสามารถทำเช่นนี้ได้เช่นกัน

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 printf ดังต่อไปนี้ ${info.timestamp} [${info.level.toUpperCase()}]: ${info.message} ${JSON.stringify(info)}รวมถึงระดับการประทับเวลาและข้อความที่ฉันคิดว่าฉันสามารถลบได้
SomethingOn

9

คุณสามารถใช้ในตัว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

1
น่าเสียดายที่util.error()ข้ามการประทับเวลาเอาต์พุต
ศรัณย์

4

แม้ว่าฉันจะไม่ทราบถึง 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+


FYI: log4js-node (0.5+) เวอร์ชันใหม่กว่าจะไม่แทนที่ console.log โดยอัตโนมัติ
Jeff Hiltz

@jeffhiltz คุณพูดถูก :) ตอนนี้เป็นพารามิเตอร์ที่กำหนดค่าได้
ทมิฬ


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

ฉันรับคำตอบของ 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

1
love that ... copy paste solution !!
Mr.P

1

อีกวิธีหนึ่งคือการรวมตัวบันทึกไว้ในไฟล์ที่ส่งออกฟังก์ชันบางอย่างเช่น 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"}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.