如何使用winston logger记录节点错误?

时间:2018-04-05 18:36:13

标签: javascript node.js logging error-handling winston

在我的节点应用程序中,我使用Winstonjs记录器。今天我的应用程序似乎冻结了,但它没有记录某些东西。我停止了应用程序并手动运行它,这显示了我的错误

ReferenceError: totalValue is not defined

我在代码中明显犯了一个错误,但我的主要问题是我从Winston日志中无法知道。

我在下面粘贴了我的Winston实现。我创建了这个,以便我可以简单地使用log('The log message');。但是这不记录任何发生的节点错误。

有人知道如何将每个发生的节点错误都记录到我的Winston日志中吗?

const myFormat = winston.format.printf(info => {
    return `${info.timestamp} ${info.level}: ${info.message}`;
});
const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), myFormat),  // winston.format.json(),
    transports: [
        new winston.transports.File({filename: 'logs/error.log', level: 'error'}),
        new winston.transports.File({filename: 'logs/combined.log'}),
    ]
});
function log(message, level='info'){
    if (typeof message === 'object'){
        message = JSON.stringify(message);
    }
    logger[level](message);
}

2 个答案:

答案 0 :(得分:3)

Winston可以为您记录例外情况。来自文档:Exceptions

  

使用winston,可以捕获并记录进程中的uncaughtException事件。使用您自己的记录器实例,您可以在应用程序生命周期中创建或稍后启用此行为:

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

// Enable exception handling when you create your logger.
const logger = createLogger({
  transports: [
    new transports.File({ filename: 'combined.log' }) 
  ],
  exceptionHandlers: [
    new transports.File({ filename: 'exceptions.log' })
  ]
});

// Or enable it later on by adding a transport or using `.exceptions.handle`
const logger = createLogger({
  transports: [
    new transports.File({ filename: 'combined.log' }) 
  ]
});

// Call exceptions.handle with a transport to handle exceptions
logger.exceptions.handle(
  new transports.File({ filename: 'exceptions.log' })

答案 1 :(得分:1)

您可以像这样使用它:

const winston = require('winston');
require('winston-daily-rotate-file');

function getLogger(module) {

var transport = new (winston.transports.DailyRotateFile)({
  filename: './logs/log',
  datePattern: 'yyyy-MM-dd.',
  prepend: true,
  level: process.env.ENV === 'development' ? 'debug' : 'error'
});

const logger = new (winston.Logger)({
  transports: [
    transport
  ]
});
return logger;
}

module.exports = getLogger;

将它放在一个单独的文件中,无论你想在哪里使用它都需要它然后你就可以这样使用它:
log.debug('This is debug statement!')
log.error('Logging exception here')

您始终可以更改transport对象中的日志级别,因此会记录您的语句。此外,此代码将每天轮换您的文件并根据日期创建一个新文件。这有助于不拥有一个单一的大文件