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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark