如何将NodeJs日志从控制台重定向到文件

时间:2018-10-13 11:47:25

标签: node.js winston

我对NodeJ非常陌生。 Afair NodeJs不会直接将日志写入文件,因此我必须使用外部日志库。比方说温斯顿。

我希望所有模块都将日志写入Winston创建的文件,我也希望所有console.log / console.info也都可以写入Winston。

const logger = createLogger({
    format: combine(
        appendTimestamp({ tz: 'Europe/London' }),
        myFormat
    ),
    transports: [
        new transports.Console(),
        new winston.transports.File({
            filename: 'error.log',
            dirname: '/logs/',
            level: 'error',
            datePattern: 'yyyy-MM-dd.'
        }),
        new winston.transports.File({
            filename: 'application.log',
            dirname: '/logs/',
            datePattern: 'yyyy-MM-dd.'
        })
    ]
});

如果我使用logger.info-可以正常工作。但是我仍然可以看到某些模块正在使用stout / stderr。

在Java中,此问题按以下方式解决-每个第三方库都使用日志记录适配器。 stderr的stdout中没有任何内容。通过在类路径中包含日志记录库和日志记录配置,由应用程序本身及其依赖项生成的所有应用程序日志都将放在一个位置。

我知道,我可以将日志重定向到节点node index.js > mylog.js之后,但是我希望旋转日志。

使用自定义记录器或console.log / console.info在应用中写入日志的最佳做法是什么?

其他第三方模块/库如何编写日志消息?他们使用的是console.log还是拥有某种类似Java的日志记录适配器是一件好事。

也许我可以使用类似的方法,但是我不确定这是否正确

console.log = function() {
   logger.info.apply(null, arguments);
}

console.error = function() {
   logger.error.apply(null, arguments);
}

1 个答案:

答案 0 :(得分:0)

console是全局变量,许多库使用它来将日志输出到stdout。没有“适当的”方法来拦截对console.log的所有这些调用,而又不修改全局变量,因为您有一个问题的例子。

对于它的价值,可以使用logrotate之类的工具来旋转日志。如果您想捕获 all 输出,则重定向stdout对您的过程来说是个好主意。某些第三方库将为您提供一种注入自己的记录器的方法,但就我所知,大部分时间并非如此。

相关问题