如何解决如何使用像 Bunyan 这样的记录器来捕捉错误?
我在 Docker 容器内运行 NodeJS 脚本,该容器位于 Google 计算实例内的容器优化操作系统内。
简单的 console.log()
不会到达 Google Cloud Logger。因此我使用 bunyan
库。
但是,我有两个问题:
- 我使用的一些库只是将日志写入
stdout
,我无法看到它们,除非通过 SSH 连接到 GCE 实例并在那里闲逛。 - 我是一个人,可能会搞乱线程或其他事情。在这种情况下,可能会出现一个错误,该错误也不会显示在 Cloud Logger 中。
那么,问题是:如何让 NodeJS 将 stdout
和 stderr
日志发送到 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
回调中。这只是一个例子。
解决方法
不要让您的服务器崩溃:
process.setUncaughtExceptionCaptureCallback(logger.error);
process.on('unhandledRejection',e => logger.error(e));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。