lambda-logでAWS Lambda(nodejs)のロギング

最近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)
    })
  }

Comment