A nodejs logger for AWS Lambda
- Writes logs to stdout using console.log
- Logs in JSON format
- Supports log levels: DEBUG, INFO, WARN, ERROR and OFF
- Defaults to log level INFO
- Built using typescript and includes types
Basic example:
import { APIGatewayEvent } from 'aws-lambda';
import { log } from 'pn-lambda-logger';
import { ok } from '../aws/response';
export const healthCheck = async (event: APIGatewayEvent, context: AWSLambda.Context, cb: AWSLambda.Callback) => {
log.info({ message: 'Message' });
}
{
"@timestamp": 1541421856289,
"level": "INFO",
"message": "Message"
}
Context and meta data
import { APIGatewayEvent } from 'aws-lambda';
import { log } from 'pn-lambda-logger';
import { ok } from '../aws/response';
export const healthCheck = async (event: APIGatewayEvent, context: AWSLambda.Context, cb: AWSLambda.Callback) => {
log.setup({ context, host: event.headers['Host'], verb: event.httpMethod, useragent: event.headers['User-Agent'], query: event.queryStringParameters, path: event.path, xRequestId: event.headers['X-REQUEST-ID'] });
log.info({ message: 'Message' });
cb(null, ok({ status: 'UP' }));
};
{
"@timestamp": 1541460988579,
"level": "INFO",
"message": "Message",
"host": "abc123.execute-api.eu-west-1.amazonaws.com",
"verb": "GET",
"path": "/manage/health",
"useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"query": {
"hello": "world"
},
"awsRequestId": "asdas-adsas-asdasdas-asdasda-adss",
"functionName": "hello",
"invokedFunctionArn": "arn:cccccc",
"memoryLimitInMB": 1024,
"remainingTime": 11147
}
Log Levels
The default log level is INFO log.level = LogLevels.INFO;
.
To show debug messages you need to explicitly set the log.level to DEBUG like this:
log.level = LogLevels.DEBUG;
log.debug({ message: 'message' });
{
"@timestamp": 1541421856291,
"level": "DEBUG",
"message": "Message",
}
You can add any number of extra properties to the object when logging, like this:
log.setup({ context, host: event.headers['Host'], verb: event.httpMethod, useragent: event.headers['User-Agent'], query: event.queryStringParameters, path: event.path, xRequestId: event.headers['X-REQUEST-ID'] });
log.info({ message: 'Message', myProp: 'hello', myNestedProp: {subProp: 'something'} });
{
stdoutHijacker.ts:12
"@timestamp": 1541429192677,
"level": "INFO",
"message": "Message",
"host": "abc123.execute-api.eu-west-1.amazonaws.com",
"verb": "GET",
"path": "/manage/health",
"useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
"query": {
"hello": "world"
},
"awsRequestId": "a3de505e-f16b-42f4-b3e6-bcd2e4a73903",
"functionName": "ExampleCloudFormationStackName-ExampleLambdaFunctionResourceName-AULC3LB8Q02F",
"functionVersion": "$LATEST",
"invokedFunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:ExampleCloudFormationStackName-ExampleLambdaFunctionResourceName-AULC3LB8Q02F",
"memoryLimitInMB": 128,
"remainingTime": 3,
"myProp": "hello",
"myNestedProp": {
"subProp": "something"
}
}
Mute all logs:
log.level = LogLevels.OFF;
Set log level with environment variable
You can easily set the initial log level by setting the environment variable PN_LOG_LEVEL
. This can be useful for setting different log levels in different environments TEST|PROD etc. Use 'OFF', 'DEBUG', 'INFO', 'WARN' or 'ERROR', like this:
PN_LOG_LEVEL: 'DEBUG'