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

How to redirect NodeJs logs from console to file

我是 NodeJs 的新手。 Afair NodeJs 不会直接将日志写入文件,所以我必须使用外部日志库。比方说温斯顿。

我希望所有模块都将日志写入 Winston 创建的文件,我也希望所有控制台。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 中,这个问题解决如下 - 每个第三方库都使用日志记录适配器。 stdout、stderr 中没有任何内容。通过在类路径中包含日志库和日志配置,应用程序本身及其依赖项生成的所有应用程序日志都集中在一个地方。

我知道,我可以将日志重定向到以下节点 node index.js > mylog.js,但我希望轮换我的日志。

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

其他第 3 方 modules/libraries 如何写入日志消息?他们是在使用 console.log 还是像 Java 中那样使用某种日志记录适配器?

也许我可以用这样的东西,但我不确定它是否是正确的方法

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

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

console 是全局的,被很多库用来输出日志到stdout。没有 "proper" 方法可以在不修改全局的情况下拦截对 console.log 的所有这些调用,因为您在问题中有一个示例。

就其价值而言,可以使用 logrotate 等工具轮换日志。如果你想捕获 all 输出,重定向 stdout 对你的进程来说是个不错的主意。一些 3rd 方库会为您提供一种注入自己的记录器的方法,但大多数情况下并非如此(据我所知)。