Skip to content

Commit dfcb71a

Browse files
authored
fix: logging (#652)
* fix(logger): fix regression #651 * fix(types): better types for logger
1 parent d5246a7 commit dfcb71a

File tree

4 files changed

+186
-57
lines changed

4 files changed

+186
-57
lines changed

__tests__/integration.js

Lines changed: 116 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -522,19 +522,130 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
522522
// expect(customLogger.debug.mock.calls.length).toBe(0)
523523
})
524524

525+
test('custom levels', () => {
526+
const loggerError = serverlessExpressLogger({ level: 'error' })
527+
528+
loggerError.error('error')
529+
loggerError.info('nocall')
530+
loggerError.warn('nocall')
531+
loggerError.debug('nocall')
532+
loggerError.verbose('nocall')
533+
expect(global.console.warn).not.toHaveBeenCalled()
534+
expect(global.console.debug).not.toHaveBeenCalled()
535+
expect(global.console.info).not.toHaveBeenCalled()
536+
expect(global.console.error).toHaveBeenLastCalledWith({
537+
message: 'error'
538+
})
539+
540+
const loggerWarn = serverlessExpressLogger({ level: 'warn' })
541+
542+
loggerWarn.error('error2')
543+
loggerWarn.warn('warn2')
544+
loggerWarn.info('nocall')
545+
loggerWarn.debug('nocall')
546+
loggerWarn.verbose('nocall')
547+
expect(global.console.debug).not.toHaveBeenCalled()
548+
expect(global.console.info).not.toHaveBeenCalled()
549+
expect(global.console.error).toHaveBeenLastCalledWith({
550+
message: 'error2'
551+
})
552+
expect(global.console.warn).toHaveBeenLastCalledWith({
553+
message: 'warn2'
554+
})
555+
556+
const loggerInfo = serverlessExpressLogger({ level: 'info' })
557+
558+
loggerInfo.error('error3')
559+
loggerInfo.warn('warn3')
560+
loggerInfo.info('info3')
561+
loggerInfo.debug('nocall')
562+
loggerInfo.verbose('nocall')
563+
expect(global.console.debug).not.toHaveBeenCalled()
564+
expect(global.console.error).toHaveBeenLastCalledWith({
565+
message: 'error3'
566+
})
567+
expect(global.console.warn).toHaveBeenLastCalledWith({
568+
message: 'warn3'
569+
})
570+
expect(global.console.info).toHaveBeenLastCalledWith({
571+
message: 'info3'
572+
})
573+
574+
const loggerVerbose = serverlessExpressLogger({ level: 'verbose' })
575+
576+
loggerVerbose.error('error4')
577+
loggerVerbose.warn('warn4')
578+
loggerVerbose.info('info4')
579+
loggerVerbose.verbose('verbose4')
580+
loggerVerbose.debug('nocall')
581+
expect(global.console.error).toHaveBeenLastCalledWith({
582+
message: 'error4'
583+
})
584+
expect(global.console.warn).toHaveBeenLastCalledWith({
585+
message: 'warn4'
586+
})
587+
expect(global.console.info).toHaveBeenLastCalledWith({
588+
message: 'info4'
589+
})
590+
expect(global.console.debug).toHaveBeenLastCalledWith({
591+
message: 'verbose4'
592+
})
593+
594+
const loggerDebug = serverlessExpressLogger({ level: 'debug' })
595+
596+
loggerDebug.error('error5')
597+
loggerDebug.warn('warn5')
598+
loggerDebug.info('info5')
599+
loggerDebug.verbose('verbose5')
600+
loggerDebug.debug('debug5')
601+
expect(global.console.error).toHaveBeenLastCalledWith({
602+
message: 'error5'
603+
})
604+
expect(global.console.warn).toHaveBeenLastCalledWith({
605+
message: 'warn5'
606+
})
607+
expect(global.console.info).toHaveBeenLastCalledWith({
608+
message: 'info5'
609+
})
610+
expect(global.console.debug).toHaveBeenLastCalledWith({
611+
message: 'debug5'
612+
})
613+
})
614+
525615
test('lazy print of logger', async () => {
526-
const logger = serverlessExpressLogger()
616+
const logger = serverlessExpressLogger({ level: 'debug' })
527617

618+
logger.debug('simple message')
528619
logger.debug('debug', () => '=true', ' works')
529620
logger.debug(() => 'debug')
621+
logger.debug('array', ['message'])
530622

531-
expect(global.console.debug).not.toHaveBeenNthCalledWith(
623+
expect(global.console.debug).toHaveBeenNthCalledWith(
532624
1,
533-
'debug=true works'
625+
{
626+
message: 'simple message'
627+
}
534628
)
535-
expect(global.console.debug).not.toHaveBeenNthCalledWith(
629+
expect(global.console.debug).toHaveBeenNthCalledWith(
536630
2,
537-
'debug'
631+
{
632+
message: 'debug',
633+
0: '=true',
634+
1: ' works'
635+
}
636+
)
637+
expect(global.console.debug).toHaveBeenNthCalledWith(
638+
3,
639+
{
640+
message: 'debug'
641+
}
642+
)
643+
expect(global.console.debug).toHaveBeenNthCalledWith(
644+
4,
645+
{
646+
message: 'array',
647+
0: ['message']
648+
}
538649
)
539650
})
540651
})

src/configure.d.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { RequestListener } from "http";
2-
import { Handler } from "aws-lambda";
3-
import Logger from "./logger";
4-
import Framework from "./frameworks";
1+
import { RequestListener } from 'http';
2+
import { Handler } from 'aws-lambda';
3+
import { Logger } from './logger';
4+
import Framework from './frameworks';
55

6-
type EventSources = "AWS_SNS" | "AWS_DYNAMODB" | "AWS_EVENTBRIDGE" | "AWS_SQS" | "AWS_KINESIS_DATA_STREAM";
6+
type EventSources = 'AWS_SNS' | 'AWS_DYNAMODB' | 'AWS_EVENTBRIDGE' | 'AWS_SQS' | 'AWS_KINESIS_DATA_STREAM';
77

88
interface EventSource {
99
getRequest?: any; // TODO:
@@ -49,9 +49,7 @@ export interface ConfigureResult<TEvent = any, TResult = any> {
4949
proxy: (proxyParams: ProxyParams) => Promise<Object>;
5050
}
5151

52-
declare function configure<TEvent = any, TResult = any>(
53-
configureParams: ConfigureParams
54-
): Handler<TEvent, TResult> & ConfigureResult<TEvent, TResult>;
52+
declare function configure<TEvent = any, TResult = any>(configureParams: ConfigureParams): Handler<TEvent, TResult> & ConfigureResult<TEvent, TResult>;
5553

5654
// declare function proxy(proxyParams: ProxyParams): Promise<any>
5755

src/logger.d.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
interface Logger {
2-
info: (message: string, additional: Object) => void
3-
debug: (message: string, additional: Object) => void
4-
error: (message: string, additional: Object) => void
1+
export interface Logger {
2+
info: (message: string, ...additional: Object[]) => void;
3+
debug: (message: string, ...additional: Object[]) => void;
4+
error: (message: string, ...additional: Object[]) => void;
5+
warn: (message: string, ...additional: Object[]) => void;
6+
verbose: (message: string, ...additional: Object[]) => void;
7+
}
8+
interface Options {
9+
level?: 'error' | 'warn' | 'info' | 'verbose' | 'debug' | string;
510
}
611

7-
export default Logger
12+
export default function logger(options?: Options): Logger;

src/logger.js

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,64 @@
1-
const lazyPrint = (value) => {
2-
if (typeof value === 'function') { return value() }
1+
const lazyPrint = value => {
2+
if (typeof value === 'function') {
3+
return value()
4+
}
35

46
return value
57
}
68

7-
function logger ({
8-
level = 'error'
9-
} = {}) {
10-
return {
11-
error (message, ...additional) {
12-
if (!level.includes('debug', 'verbose', 'info', 'warn', 'error')) return
13-
console.error({
14-
message: lazyPrint(message),
15-
...additional.map(lazyPrint)
16-
})
17-
},
18-
warn (message, ...additional) {
19-
if (!level.includes('debug', 'verbose', 'info', 'warn')) return
20-
console.warn({
21-
message: lazyPrint(message),
22-
...additional.map(lazyPrint)
23-
})
24-
},
25-
info (message, additional) {
26-
if (!level.includes('debug', 'verbose', 'info')) return
27-
console.info({
28-
message: lazyPrint(message),
29-
...additional.map(lazyPrint)
30-
})
31-
},
32-
verbose (message, additional) {
33-
if (!level.includes('debug', 'verbose')) return
34-
console.debug({
35-
message: lazyPrint(message),
36-
...additional.map(lazyPrint)
37-
})
38-
},
39-
debug (message, additional) {
40-
if (level !== 'debug') return
41-
console.debug({
9+
const logLevels = {
10+
debug: [
11+
['debug', 'debug'],
12+
['verbose', 'debug'],
13+
['info', 'info'],
14+
['error', 'error'],
15+
['warn', 'warn']
16+
],
17+
verbose: [
18+
['verbose', 'debug'],
19+
['info', 'info'],
20+
['error', 'error'],
21+
['warn', 'warn']
22+
],
23+
info: [
24+
['info', 'info'],
25+
['error', 'error'],
26+
['warn', 'warn']
27+
],
28+
warn: [
29+
['warn', 'warn'],
30+
['error', 'error']
31+
],
32+
error: [['error', 'error']],
33+
none: []
34+
}
35+
36+
const print =
37+
fn =>
38+
(message, ...additional) =>
39+
console[fn]({
4240
message: lazyPrint(message),
43-
...additional.map(lazyPrint)
41+
...(Array.isArray(additional) ? additional.map(lazyPrint) : [])
4442
})
45-
}
43+
44+
const NO_OP = () => {}
45+
46+
function logger ({ level = 'error' } = {}) {
47+
const levels = logLevels[level]
48+
49+
const logger = {
50+
error: NO_OP,
51+
debug: NO_OP,
52+
info: NO_OP,
53+
verbose: NO_OP,
54+
warn: NO_OP
4655
}
56+
57+
if (!levels) return logger
58+
59+
for (const [level2, consoleMethod] of levels) logger[level2] = print(consoleMethod)
60+
61+
return logger
4762
}
4863

4964
module.exports = logger

0 commit comments

Comments
 (0)