【问题标题】:How to redirect NodeJs logs from console to file如何将 NodeJs 日志从控制台重定向到文件
【发布时间】:2019-03-18 10:57:02
【问题描述】:

我是 NodeJs 的新手。 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 中,这个问题解决如下 - 每个第三方库都使用日志适配器。 stdout、stderr 中没有写入任何内容。通过在类路径中包含日志库和日志配置,应用程序本身及其依赖项生成的所有应用程序日志都集中到一个位置。

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

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

其他 3-rd 方模块/库如何编写日志消息?他们是在使用console.log,还是最好有某种像Java 那样的日志适配器。

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

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

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

【问题讨论】:

    标签: node.js winston


    【解决方案1】:

    console 是一个全局变量,许多库使用它来将日志输出到标准输出。没有“正确”的方式来拦截所有这些对console.log 的调用而不修改全局,因为您在问题中有一个示例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多