From 781cf79ec87b876a0dd78dddfd6897c00f4b72d8 Mon Sep 17 00:00:00 2001 From: Kristine Jetzke Date: Mon, 2 Dec 2019 23:02:51 +0100 Subject: [PATCH 1/2] Add option to change log level for websocket logs --- docs/providers/aws/events/websocket.md | 13 +++++++ .../compile/events/websockets/lib/stage.js | 22 ++++++++++-- .../events/websockets/lib/stage.test.js | 34 ++++++++++++++++++- 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/docs/providers/aws/events/websocket.md b/docs/providers/aws/events/websocket.md index bc5aa990a..61cfd906e 100644 --- a/docs/providers/aws/events/websocket.md +++ b/docs/providers/aws/events/websocket.md @@ -212,3 +212,16 @@ provider: ``` The log streams will be generated in a dedicated log group which follows the naming schema `/aws/websocket/{service}-{stage}`. + +The default log level will be INFO. You can change this to error with the following: + +```yml +# serverless.yml +provider: + name: aws + logs: + websocket: + level: ERROR +``` + +Valid values are INFO, ERROR. diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js index a9abb0bd4..17a97dafd 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.js @@ -2,6 +2,10 @@ const BbPromise = require('bluebird'); const ensureApiGatewayCloudWatchRole = require('../../lib/ensureApiGatewayCloudWatchRole'); +const ServerlessError = require('../../../../../../../classes/Error').ServerlessError; + +const defaultLogLevel = 'INFO'; +const validLogLevels = new Set(['INFO', 'ERROR']); module.exports = { compileStage() { @@ -15,7 +19,7 @@ module.exports = { if (provider.apiGateway && provider.apiGateway.websocketApiId) return null; // logs - const logsEnabled = provider.logs && provider.logs.websocket; + const logs = provider.logs && provider.logs.websocket; const stageLogicalId = this.provider.naming.getWebsocketsStageLogicalId(); const logGroupLogicalId = this.provider.naming.getWebsocketsLogGroupLogicalId(); @@ -35,7 +39,19 @@ module.exports = { Object.assign(cfTemplate.Resources, { [stageLogicalId]: stageResource }); - if (!logsEnabled) return null; + if (!logs) return null; + + let level = defaultLogLevel; + if (logs.level) { + level = logs.level; + if (!validLogLevels.has(level)) { + throw new ServerlessError( + `provider.logs.websocket.level is set to an invalid value. Support values are ${Array.from( + validLogLevels + ).join(', ')}, got ${level}.` + ); + } + } // create log-specific resources Object.assign(stageResource.Properties, { @@ -54,7 +70,7 @@ module.exports = { }, DefaultRouteSettings: { DataTraceEnabled: true, - LoggingLevel: 'INFO', + LoggingLevel: level, }, }); diff --git a/lib/plugins/aws/package/compile/events/websockets/lib/stage.test.js b/lib/plugins/aws/package/compile/events/websockets/lib/stage.test.js index 1a0f0ba81..775fd6a74 100644 --- a/lib/plugins/aws/package/compile/events/websockets/lib/stage.test.js +++ b/lib/plugins/aws/package/compile/events/websockets/lib/stage.test.js @@ -1,6 +1,8 @@ 'use strict'; -const expect = require('chai').expect; +const chai = require('chai'); + +const expect = chai.expect; const sinon = require('sinon'); const BbPromise = require('bluebird'); const _ = require('lodash'); @@ -9,6 +11,8 @@ const AwsCompileWebsocketsEvents = require('../index'); const Serverless = require('../../../../../../../Serverless'); const AwsProvider = require('../../../../../provider/awsProvider'); +chai.use(require('chai-as-promised')); + describe('#compileStage()', () => { let awsCompileWebsocketsEvents; let stageLogicalId; @@ -151,6 +155,34 @@ describe('#compileStage()', () => { }); }); + it('should use valid logging level', () => { + awsCompileWebsocketsEvents.serverless.service.provider.logs = { + websocket: { + level: 'ERROR', + }, + }; + + return awsCompileWebsocketsEvents.compileStage().then(() => { + const resources = + awsCompileWebsocketsEvents.serverless.service.provider.compiledCloudFormationTemplate + .Resources; + + expect(resources[stageLogicalId].Properties.DefaultRouteSettings.LoggingLevel).equal( + 'ERROR' + ); + }); + }); + + it('should reject invalid logging level', () => { + awsCompileWebsocketsEvents.serverless.service.provider.logs = { + websocket: { + level: 'FOOBAR', + }, + }; + + expect(awsCompileWebsocketsEvents.compileStage()).to.be.rejectedWith('invalid value'); + }); + it('should ensure ClousWatch role custom resource', () => { return awsCompileWebsocketsEvents.compileStage().then(() => { const resources = From 093cd4e3df06cd544f70fc93b0814f584d1a34e1 Mon Sep 17 00:00:00 2001 From: Philipp Muens Date: Tue, 3 Dec 2019 14:06:41 +0100 Subject: [PATCH 2/2] Update serverless.yml documentation --- docs/providers/aws/guide/serverless.yml.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/providers/aws/guide/serverless.yml.md b/docs/providers/aws/guide/serverless.yml.md index 7b2ae3dc7..be859e189 100644 --- a/docs/providers/aws/guide/serverless.yml.md +++ b/docs/providers/aws/guide/serverless.yml.md @@ -136,14 +136,15 @@ provider: apiGateway: true lambda: true # Optional, can be true (true equals 'Active'), 'Active' or 'PassThrough' logs: - restApi: # Optional configuration which specifies if API Gateway logs are used. This can either be set to true to use defaults, or configured via subproperties. + restApi: # Optional configuration which specifies if API Gateway logs are used. This can either be set to `true` to use defaults, or configured via subproperties. accessLogging: true # Optional configuration which enables or disables access logging. Defaults to true. format: 'requestId: $context.requestId' # Optional configuration which specifies the log format to use for access logging. executionLogging: true # Optional configuration which enables or disables execution logging. Defaults to true. level: INFO # Optional configuration which specifies the log level to use for execution logging. May be set to either INFO or ERROR. fullExecutionData: true # Optional configuration which specifies whether or not to log full requests/responses for execution logging. Defaults to true. role: arn:aws:iam::123456:role # Optional IAM role for ApiGateway to use when managing CloudWatch Logs - websocket: true # Optional configuration which specifies if Websockets logs are used + websocket: # Optional configuration which specifies if Websocket logs are used. This can either be set to `true` to use defaults, or configured via subproperties. + level: INFO # Optional configuration which specifies the log level to use for execution logging. May be set to either INFO or ERROR. frameworkLambda: true # Optional, whether to write CloudWatch logs for custom resource lambdas as added by the framework package: # Optional deployment packaging configuration