Skip to content
This repository was archived by the owner on Oct 27, 2022. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,6 @@ dist

# TernJS port file
.tern-port

# IDE
.vscode
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@
"dependencies": {
"@aws-sdk/client-eventbridge": "^3.47.0",
"@sentry/serverless": "^6.13.3",
"@types/lambda-log": "^2.2.1",
"aws-sdk": "^2.1048.0",
"aws-xray-sdk": "^3.3.3",
"cross-fetch": "^3.1.4",
"fp-ts": "^2.11.5",
"graphql": "15.7.0",
"io-ts": "^2.2.16",
"mysql": "^2.18.1",
"pino": "^7.10.0"
"lambda-log": "^3.1.0",
"mysql": "^2.18.1"
},
"peerDependencies": {
"fp-ts": "^2.11.5",
Expand Down
17 changes: 14 additions & 3 deletions src/Logger/LogStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,27 @@ export class LogStore {
return `${this.logs.length}/${this.capacity}`
}

public appendLog = (l: Log) => {
public appendLog = (l: Log, level = 'debug') => {
if (this.logs.length >= this.capacity) {
this.logger.warn(
`MAXIMUM LOG STORE CAPACITY EXEEDED (${this.capacity} logs)`
`MAXIMUM LOG STORE CAPACITY EXCEEDED (${this.capacity} logs)`
)
return
}

if (this.areLogEnabled()) {
this.logger.debug(l[0], l[1])
switch (level) {
case 'info':
this.logger.info(l[0], l[1])
case 'error':
this.logger.warn(l[0], l[1])
case 'error':
this.logger.error(l[0], l[1])
case 'debug':
this.logger.debug(l[0], l[1])
default:
this.logger.info(l[0], l[1])
}
}

this.logs.push(l)
Expand Down
24 changes: 13 additions & 11 deletions src/Logger/Logger.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
import pino from 'pino'
import * as logger from 'lambda-log'

export type Log = [message: string, mergingObject?: Record<string, unknown>]

interface LoggerOptions {
name: string
export interface LoggerOptions {
level: LogLevel
}

export type LogLevel = 'info' | 'warn' | 'error' | 'debug' | 'silent'

export interface Logger {
debug(...args: Log): void
warn(msg: string): void
info(msg: string): void
warn(...args: Log): void
error(...args: Log): void
info(...args: Log): void
}

export const getPinoLogger = ({ name }: LoggerOptions): Logger => {
const logger = pino({ name, level: 'debug' })

export const getLogger = (): Logger => {
return {
debug: (...args: Log) => {
logger.debug(args[1], args[0])
logger.debug(args[0], args[1])
},
warn: (msg: string) => logger.warn(msg),
info: (msg: string) => logger.info(msg),
warn: (...args: Log) => logger.warn(args[0], args[1]),
error: (...args: Log) => logger.error(args[0], args[1]),
info: (...args: Log) => logger.info(args[0], args[1]),
}
}
40 changes: 21 additions & 19 deletions src/__test__/LogStore.test.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import { getPinoLogger } from '../Logger/Logger'
import { getLogger } from '../Logger/Logger'
import { LogStore } from '../Logger/LogStore'

describe.only('LogStore', () => {
describe('LogStore', () => {
it('when logging and logs are enabled, it prints the log', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const pinoDebugSpy = jest.spyOn(logger, 'debug')
const logger = getLogger()
const loggerDebugSpy = jest.spyOn(logger, 'debug')

const logStore = new LogStore(logger, Infinity, () => true)

logStore.appendLog(['foo baz bar', { foo: 1, baz: ['bar'] }])

expect(pinoDebugSpy).toHaveBeenCalledWith('foo baz bar', {
expect(loggerDebugSpy).toHaveBeenCalledWith('foo baz bar', {
baz: ['bar'],
foo: 1,
})
})

it('when logging and logs are not enabled, it does not print the log', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const pinoDebugSpy = jest.spyOn(logger, 'debug')
const logger = getLogger()
const loggerDebugSpy = jest.spyOn(logger, 'debug')

const logStore = new LogStore(logger, Infinity, () => false)

logStore.appendLog(['foo baz bar', { foo: 1, baz: ['bar'] }])

expect(pinoDebugSpy).toHaveBeenCalledTimes(0)
expect(loggerDebugSpy).toHaveBeenCalledTimes(0)
})

it('when logging and maximum capacity is reached, it prints a warning', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const logger = getLogger()
const pinoWarnSpy = jest.spyOn(logger, 'warn')

const logStore = new LogStore(logger, 3, () => false)
Expand All @@ -44,16 +44,16 @@ describe.only('LogStore', () => {
})

it('when resetting the store and logs are not enabled, it prints the log', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const pinoDebugSpy = jest.spyOn(logger, 'debug')
const logger = getLogger()
const loggerDebugSpy = jest.spyOn(logger, 'debug')

const logStore = new LogStore(logger, 3, () => false)

logStore.appendLog(['foo baz bar', { foo: 1, baz: ['bar'] }])
logStore.appendLog(['foobazbar'])
logStore.reset()

expect(pinoDebugSpy.mock.calls).toEqual([
expect(loggerDebugSpy.mock.calls).toEqual([
[
'foo baz bar',
{
Expand All @@ -66,20 +66,20 @@ describe.only('LogStore', () => {
})

it('when resetting the store and logs are enabled, it does not print the log', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const pinoDebugSpy = jest.spyOn(logger, 'debug')
const logger = getLogger()
const loggerDebugSpy = jest.spyOn(logger, 'debug')

const logStore = new LogStore(logger, 3, () => true)

logStore.appendLog(['foo baz bar', { foo: 1, baz: ['bar'] }])
logStore.appendLog(['foobazbar'])
logStore.reset()

expect(pinoDebugSpy).toHaveBeenCalledTimes(2)
expect(loggerDebugSpy).toHaveBeenCalledTimes(2)
})

it('when resetting the store, the logs store is cleared', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const logger = getLogger()
const logStore = new LogStore(logger, 3, () => true)

logStore.appendLog(['foo baz bar', { foo: 1, baz: ['bar'] }])
Expand All @@ -93,12 +93,14 @@ describe.only('LogStore', () => {
})

it('pass message and merging object to logger.debug when logs are enabled', async () => {
const logger = getPinoLogger({ name: 'TEST' })
const pinoDebugSpy = jest.spyOn(logger, 'debug')
const logger = getLogger()
const loggerDebugSpy = jest.spyOn(logger, 'debug')
const logStore = new LogStore(logger, Infinity, () => true)

logStore.appendLog(['LogMessageName', { foo: 'bar' }])

expect(pinoDebugSpy).toHaveBeenCalledWith('LogMessageName', { foo: 'bar' })
expect(loggerDebugSpy).toHaveBeenCalledWith('LogMessageName', {
foo: 'bar',
})
})
})
23 changes: 7 additions & 16 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { traverseWithIndex } from 'fp-ts/lib/Record'
import { DateFromISOString } from './codecs/DateFromISOString'
import { decodeOrThrow } from './codecs/utils'
import { LogStore } from './Logger/LogStore'
import { getPinoLogger } from './Logger/Logger'
import { getLogger } from './Logger/Logger'

type SchemaRecord<K extends string> = Record<K, C.Codec<unknown, any, any>>
type EventLambdaConfig<A, K extends string> = {
Expand Down Expand Up @@ -93,10 +93,7 @@ export const _eventLambda =
}) => taskEither.TaskEither<unknown, R>
) => {
return wrapperFunc((event: EventBridgeEvent<string, O>) => {
const logStore = new LogStore(
getPinoLogger({ name: 'framework-node' }),
500
)
const logStore = new LogStore(getLogger(), 500)

logStore.appendLog(['parsing event: ', { event: event.detail }])

Expand Down Expand Up @@ -142,7 +139,7 @@ export const _eventLambda =
}

logStore.appendLog([
'handler succeded with payload: ',
'handler succeeded with payload: ',
{ success: result.right },
])
logStore.reset()
Expand Down Expand Up @@ -176,10 +173,7 @@ export const _httpLambda =
}) => taskEither.TaskEither<unknown, R>
) => {
return wrapperFunc((event: APIGatewayProxyEvent) => {
const logStore = new LogStore(
getPinoLogger({ name: 'framework-node' }),
500
)
const logStore = new LogStore(getLogger(), 500)
logStore.appendLog(['parsing body: ', { body: config.body }])

const parsedBody = pipe(
Expand Down Expand Up @@ -228,7 +222,7 @@ export const _httpLambda =
}

logStore.appendLog([
'handler succeded with payload: ',
'handler succeeded with payload: ',
{ success: result.right },
])
logStore.reset()
Expand Down Expand Up @@ -260,10 +254,7 @@ export const _appSyncLambda =
}) => taskEither.TaskEither<unknown, R>
) => {
return wrapperFunc((event: AppSyncResolverEvent<A>) => {
const logStore = new LogStore(
getPinoLogger({ name: 'framework-node' }),
500
)
const logStore = new LogStore(getLogger(), 500)
logStore.appendLog(['parsing args: ', { args: config.args }])

const parsedArgs = pipe(
Expand Down Expand Up @@ -304,7 +295,7 @@ export const _appSyncLambda =
}

logStore.appendLog([
'handler succeded with payload: ',
'handler succeeded with payload: ',
{ success: result.right },
])
logStore.reset()
Expand Down
Loading