【问题标题】:How to catch errors with loggers like Bunyan?如何捕捉像 Bunyan 这样的记录器的错误?
【发布时间】:2021-01-16 12:16:12
【问题描述】:

我在 Docker 容器内运行 NodeJS 脚本,该容器位于 Google 计算实例内的容器优化操作系统内。

简单的console.log() 无法访问 Google Cloud Logger。因此我使用bunyan 库。

但是,我有两个问题:

  1. 我使用的一些库只是将日志写入stdout,我无法看到它们,除非通过 SSH 进入 GCE 实例并在那里四处寻找。
  2. 我是一个人,可能会弄乱线程或其他东西。在这种情况下,可能会出现一个错误,该错误也不会显示在 Cloud Logger 中。

那么,问题是:如何让 NodeJS 将 stdoutstderr 日志发送到 Cloud Logger?

这是一个例子:

import { createLogger } from 'bunyan'
const { LoggingBunyan } = require('@google-cloud/logging-bunyan')
import sourceMap from 'source-map-support'
sourceMap.install()

function startLogger () {
  let streams: any[] = []
  if (process.env.__DEV__) {
    streams.push({ stream: process.stdout, level: 'debug' })
  } else {
    const loggingBunyan = new LoggingBunyan()
    streams.push(loggingBunyan.stream('debug'))
  }
  return createLogger({ name: 'my-script', streams })
}

const logger = startLogger()
process.on('unhandledRejection', logger.error)

const start = async () => {
  logger.info(`hello`)
  try {
    logger.info(`start`)

    setTimeout(() => {
      throw Error('error from timeout') // <= this must be caught by bunyan and sent to Clodu Logger
    }, 1000)

    sleep(5000)

    logger.info(`finish`)
  } catch (e) {
    logger.error('crash:', e)
  }
}

start()

function sleep (time: number) {
  return new Promise(function (resolve) {
    setTimeout(resolve, time)
  })
}

通过这个(可能是过度的)示例,我试图展示一个意外的未处理错误。我知道我可以将 try-catch 放在 setTimout 回调中。这只是一个例子。

【问题讨论】:

  • 根据git Cloud Logging 与 Bunyan 兼容。有关系吗?
  • @Mahboob 是的,它已经按照您提到的文档进行了集成。

标签: node.js logging google-cloud-platform google-cloud-logging


【解决方案1】:

不要让你的服务器崩溃:

process.setUncaughtExceptionCaptureCallback(logger.error);
process.on('unhandledRejection', e => logger.error(e));

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 2016-06-22
    • 2022-06-15
    • 2018-10-15
    • 1970-01-01
    • 2014-07-04
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多