【问题标题】:How to log node errors with winston logger?如何使用winston logger记录节点错误?
【发布时间】:2018-09-15 16:22:12
【问题描述】:

在我的节点应用程序中,我使用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);
}

【问题讨论】:

  • 你可以从文档开始。尤其是处理异常的部分:github.com/winstonjs/winston#exceptions
  • @gforce301 - 感谢您指出这一点。我之前看过文档,但我有点迷失在其中,不知道要查找什么。我使用了这个例子,它就像一个魅力。如果您可以将您的评论添加为答案(也许将示例复制粘贴到此处以符合 SO 规则)我可以将您的答案标记为已接受?

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


【解决方案1】:

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' })

【讨论】:

    【解决方案2】:

    你可以像这样简单地使用它:

    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 对象中的日志级别,因此您的语句将被记录。此外,此代码将每天轮换您的文件并根据日期创建一个新文件。这有助于不要有一个大文件

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2018-12-09
      • 1970-01-01
      相关资源
      最近更新 更多