lambda-logでAWS Lambda(nodejs)のロギング
最近AWS Lambdaのログをlambda-logでとるようになったので、その覚書です。 使い方 npm install lambda-logで追加したのちにこんな感じで使います。 Request / Response […]
広告ここから
広告ここまで
目次
最近AWS Lambdaのログをlambda-logでとるようになったので、その覚書です。
使い方
npm install lambda-log
で追加したのちにこんな感じで使います。
import { Handler } from 'aws-lambda'
import * as log from 'lambda-log'
export const handler: Handler = async (event) => {
log.options.meta.event = event
log.options.tags.push(process.env.NODE_ENV)
log.info('info')
log.warn('warn', {
meta: {
item1: 'hello'
}
})
try {
throw new Error('demo err')
} catch (err) {
log.error(err)
throw err
}
}
Request / Responseを記録するラッパーにする
リクエスト・レスポンスを記録したいので、handlerのラッパーを作っています。
import { Handler } from 'aws-lambda'
import * as log from 'lambda-log'
export function withLogger<Event, Result = any>(handler: Handler<Event, Result>, customErrorHandler?: (err: Error) => void): Handler {
return async (event, context) => {
log.options.meta = {
event,
context,
stage: process.env.NODE_ENV,
}
log.info('Start process')
try {
const result = await handler(event, context, () => undefined)
if (result) log.info('result', result as any)
return result
} catch(e) {
log.error('Error handled', e)
if (customErrorHandler) {
customErrorHandler(e)
}
throw e
}
}
}
これの第一引数にhandlerを入れてやれば動きます。
type Event = {
username :string
}
type Response = {
statusCode: number;
message: string;
_event: Event
}
export const handler = withLogger<Event, Response>(async (event) => {
try {
return { statusCode:200, message: 'hello', _event: event }
} catch (err) {
let response = {
statusCode: err.statusCode ? err.statusCode : 500,
message: err ? err.message || '': ''
};;
if (err) {
log.error('error',err)
rollbar.error(err);
}
return response
}
})
Rollbar / Sentryなどを噛ませる
withLogger
の第二引数にエラー時のハンドラー関数をつけれますので、そこでrollbarやsentryでエラーをキャプチャしてやりましょう。
import rollbar from 'rollbar'
export function withRollbarLogger<Event, Result = any>(handler: Handler<Event, Result>): Handler {
return withLogger<Event, Result>(handler, (e) => {
rollbar.error(e)
})
}