我在Docker容器内运行NodeJS脚本,这是在Google Compute实例内的容器优化操作系统内。
简单的console.log()
无法到达Google Cloud Logger。因此,我使用bunyan
库。
然而,我有两个问题:
- 我使用的一些库只是将日志写入
stdout
,我没有办法看到它们,除了通过ssh进入GCE实例并在那里闲逛。 我是一个人,可以搞砸线程或其他东西。在这种情况下,可能会出现错误,也不会显示在云记录器。
所以,问题是:我如何使NodeJS发送stdout
和stderr
日志到云记录器?
下面是一个例子:
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)
})
}
通过这个(可能过多的)示例,我试图展示一个意外的未处理错误。我知道我可以在setTimout
回调中放入try-catch。这只是一个例子。
不要让你的服务器崩溃:
process.setUncaughtExceptionCaptureCallback(logger.error);
process.on('unhandledRejection', e => logger.error(e));