javascript - Node 记录未捕获的异常(Winston V3)

标签 javascript node.js logging winston

我是 Winston 的新手,我正在尝试使用它来记录未捕获的异常,然后退出。它正在记录到控制台,但似乎没有时间在退出前记录到文件

这是一个例子:

索引.js

const express = require('express');
const app = express();
const logger = require('./startup/logging');

process.on('uncaughtException', (ex) => {
    logger.error("Won't be logged in the File");
    process.exit(1);
});

throw new Error("Uncaught");

日志记录.js

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

const logger = createLogger({     
    format: format.combine(
        format.timestamp({
            format: 'YYYY-MM-DD hh:mm:ss |'
        }),
        format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
    ),
    transports: [
        new transports.Console({
            format: format.combine(
                format.colorize({
                    // all: true
                }),
                // this is repeated because for some reason colorize() won't work otherwise
                format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)            
            )
        }),
        new transports.File({ filename: './exceptions.log' })
    ]
});

module.exports = logger;

如前所述,未捕获的异常记录到控制台,而不是文件。删除 process.exit(1) 解决了日志记录问题,但我确实希望程序退出。

handleExceptions: true 添加到文件传输会导致相同的问题 - 它会在记录异常之前退出。我假设这是原因,因为添加 exitOnError: false 然后记录异常。

这是预期的行为吗?这对我来说似乎很奇怪,即使是初学者。

编辑:

process.on('uncaughtException', (ex) => {
    logger.log('error', 'Will be logged');
    setTimeout(function(){process.exit(1)}, 1000);
});

这有效,但肯定不是修复,只是显示我遇到的问题

最佳答案

您使用的是什么版本?在 v2 中,您可以使用 callback在写入日志条目后执行。

process.on('uncaughtException', (ex) => {
    logger.error("Will be logged in the File", function() {
        process.exit(1);
    });
});

在 v3 中你是 supposed to do :

logger.log('info', 'some message');
logger.on('finish', () => process.exit());
logger.end();

关于javascript - Node 记录未捕获的异常(Winston V3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490333/

相关文章:

javascript - 在 D3 的一行中添加空格/间隙

javascript - admin 和 admin/* 具有相同路由的快速路由句柄

JavaScript:querySelectorAll 和 classList 切换未按预期工作

node.js - NodeJS 的 Kdb+ 驱动程序

logging - 使用日志记录模块重命名 python 中的日志文件

java - SLF4J-Log4j 记录器不记录

body 溢出的JavaScript?

node.js 子 fork 进程编码

javascript - Express - 导出多个 Router() 还是单个 Router()?

java - 如何将我的 Java 应用程序日志记录事件映射到 GCP Felexible 非兼容 App Engine 中相应的云日志记录事件级别?