From 977e8583c9e36fea94c701b400a5b9ab3b45535c Mon Sep 17 00:00:00 2001 From: kokokuo Date: Mon, 12 Sep 2022 17:32:25 +0800 Subject: [PATCH 1/5] fix(serve): default value of rate-limit and unnecessary content of audit logs - set default max to 60 in rate-limit middleware. - change audit-log middleware message format. - update test cases. --- package.json | 2 + packages/core/src/lib/utils/logger.ts | 20 ++++++++ .../src/lib/middleware/auditLogMiddleware.ts | 20 +++++--- .../src/lib/middleware/rateLimitMiddleware.ts | 17 +++++-- packages/serve/test/app.spec.ts | 3 +- .../auditLogMiddleware.spec.ts | 51 ++++++++++++++----- yarn.lock | 7 ++- 7 files changed, 96 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index c98bdbb8..2630d0b9 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "private": true, "dependencies": { "@koa/cors": "^3.3.0", + "bytes": "^3.1.2", "class-validator": "^0.13.2", "commander": "^9.4.0", "dayjs": "^1.11.2", @@ -42,6 +43,7 @@ "@nrwl/linter": "14.0.3", "@nrwl/workspace": "14.0.3", "@types/bcryptjs": "^2.4.2", + "@types/bytes": "^3.1.1", "@types/from2": "^2.3.1", "@types/glob": "^7.2.0", "@types/inquirer": "^8.0.0", diff --git a/packages/core/src/lib/utils/logger.ts b/packages/core/src/lib/utils/logger.ts index c698eb62..78431c4e 100644 --- a/packages/core/src/lib/utils/logger.ts +++ b/packages/core/src/lib/utils/logger.ts @@ -21,9 +21,13 @@ export enum LoggingLevel { FATAL = 'fatal', } +type DisplayFilePathTypes = 'hidden' | 'displayAll' | 'hideNodeModulesOnly'; + export interface LoggerOptions { level?: LoggingLevel; displayRequestId?: boolean; + displayFunctionName?: boolean; + displayFilePath?: DisplayFilePathTypes; } type LoggerMapConfig = { @@ -34,18 +38,26 @@ const defaultMapConfig: LoggerMapConfig = { [LoggingScope.CORE]: { level: LoggingLevel.DEBUG, displayRequestId: false, + displayFilePath: 'hideNodeModulesOnly', + displayFunctionName: true, }, [LoggingScope.BUILD]: { level: LoggingLevel.DEBUG, displayRequestId: false, + displayFilePath: 'hideNodeModulesOnly', + displayFunctionName: true, }, [LoggingScope.SERVE]: { level: LoggingLevel.DEBUG, displayRequestId: false, + displayFilePath: 'hideNodeModulesOnly', + displayFunctionName: true, }, [LoggingScope.AUDIT]: { level: LoggingLevel.DEBUG, displayRequestId: false, + displayFilePath: 'hidden', + displayFunctionName: false, }, }; @@ -95,6 +107,9 @@ class LoggerFactory { minLevel: options.level || prevSettings.minLevel, displayRequestId: options.displayRequestId || prevSettings.displayRequestId, + displayFunctionName: + options.displayFunctionName || prevSettings.displayFunctionName, + displayFilePath: options.displayFilePath || prevSettings.displayFilePath, }); } @@ -106,6 +121,11 @@ class LoggerFactory { requestId: () => this.asyncReqIdStorage.getStore()?.requestId as string, displayRequestId: options?.displayRequestId || defaultMapConfig[name].displayRequestId, + displayFunctionName: + options?.displayFunctionName || + defaultMapConfig[name].displayFunctionName, + displayFilePath: + options?.displayFilePath || defaultMapConfig[name].displayFilePath, }); } } diff --git a/packages/serve/src/lib/middleware/auditLogMiddleware.ts b/packages/serve/src/lib/middleware/auditLogMiddleware.ts index 931de4cf..d376ca7f 100644 --- a/packages/serve/src/lib/middleware/auditLogMiddleware.ts +++ b/packages/serve/src/lib/middleware/auditLogMiddleware.ts @@ -3,6 +3,7 @@ import { LoggerOptions, VulcanInternalExtension, } from '@vulcan-sql/core'; +import * as bytes from 'bytes'; import { BuiltInMiddleware, KoaContext, Next } from '@vulcan-sql/serve/models'; @VulcanInternalExtension('audit-log') @@ -15,17 +16,22 @@ export class AuditLoggingMiddleware extends BuiltInMiddleware { public async handle(context: KoaContext, next: Next) { if (!this.enabled) return next(); - const { path, request, params, response } = context; - const { header, query } = request; + const { request: req, response: resp, params } = context; + + const reqSize = req.length ? bytes(req.length).toLowerCase() : 'none'; + const respSize = resp.length ? bytes(resp.length).toLowerCase() : 'none'; /** * TODO: The response body of our API server might be huge. * We can let users to set what data they want to record in config in the future. */ - this.logger.info(`request: path = ${path}`); - this.logger.info(`request: header = ${JSON.stringify(header)}`); - this.logger.info(`request: query = ${JSON.stringify(query)}`); - this.logger.info(`request: params = ${JSON.stringify(params)}.`); + this.logger.info( + `--> ${req.ip} -- "${req.method} ${req.path}" -- size: ${reqSize}` + ); + this.logger.info(` -> header: ${JSON.stringify(req.header)}`); + this.logger.info(` -> query: ${JSON.stringify(req.query)}`); + this.logger.info(` -> params: ${JSON.stringify(params)}`); await next(); - this.logger.info(`response: body = ${JSON.stringify(response.body)}`); + this.logger.info(`<-- status: ${resp.status} -- size: ${respSize}`); + this.logger.info(` <- header: ${JSON.stringify(resp.header)}`); } } diff --git a/packages/serve/src/lib/middleware/rateLimitMiddleware.ts b/packages/serve/src/lib/middleware/rateLimitMiddleware.ts index fd52381d..3b3ddda7 100644 --- a/packages/serve/src/lib/middleware/rateLimitMiddleware.ts +++ b/packages/serve/src/lib/middleware/rateLimitMiddleware.ts @@ -1,15 +1,26 @@ import { RateLimit, RateLimitOptions } from 'koa2-ratelimit'; import { BuiltInMiddleware, KoaContext, Next } from '@vulcan-sql/serve/models'; -import { VulcanInternalExtension } from '@vulcan-sql/core'; +import { VulcanInternalExtension, TYPES as CORE_TYPES } from '@vulcan-sql/core'; +import { inject } from 'inversify'; export { RateLimitOptions }; @VulcanInternalExtension('rate-limit') export class RateLimitMiddleware extends BuiltInMiddleware { - private koaRateLimit = RateLimit.middleware(this.getOptions()); + private options: RateLimitOptions; + private koaRateLimitFunc; + constructor( + @inject(CORE_TYPES.ExtensionConfig) config: any, + @inject(CORE_TYPES.ExtensionName) name: string + ) { + super(config, name); + this.options = (this.getOptions() as RateLimitOptions) || { max: 60 }; + if (!this.options['max']) this.options['max'] = 60; + this.koaRateLimitFunc = RateLimit.middleware(this.options); + } public async handle(context: KoaContext, next: Next) { if (!this.enabled) return next(); - return this.koaRateLimit(context, next); + return this.koaRateLimitFunc(context, next); } } diff --git a/packages/serve/test/app.spec.ts b/packages/serve/test/app.spec.ts index bb8d824f..9fb02f5b 100644 --- a/packages/serve/test/app.spec.ts +++ b/packages/serve/test/app.spec.ts @@ -369,6 +369,7 @@ describe('Test vulcan server for calling restful APIs', () => { // Assert expect(response.body.data).toEqual(expected); - } + }, + 10000 ); }); diff --git a/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts b/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts index cfaff04b..56180778 100644 --- a/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts +++ b/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts @@ -10,6 +10,7 @@ import { AuditLoggingMiddleware, RequestIdMiddleware, } from '@vulcan-sql/serve/middleware'; +import bytes = require('bytes'); describe('Test audit logging middlewares', () => { afterEach(() => { @@ -19,12 +20,16 @@ describe('Test audit logging middlewares', () => { // Arrange const ctx: KoaContext = { ...sinon.stubInterface(), - path: faker.internet.url(), + params: { uuid: faker.datatype.uuid(), }, request: { ...sinon.stubInterface(), + ip: faker.internet.ip(), + method: faker.internet.httpMethod(), + path: faker.internet.url(), + length: faker.datatype.number({ min: 100, max: 100000 }), header: { ...sinon.stubInterface(), 'X-Agent': 'test-normal-client', @@ -36,17 +41,26 @@ describe('Test audit logging middlewares', () => { }, response: { ...sinon.stubInterface(), + status: 200, + length: faker.datatype.number({ min: 100, max: 100000 }), body: { result: 'OK', }, }, }; + const { request: req, response: resp } = ctx; + const expected = [ - `request: path = ${ctx.path}`, - `request: header = ${JSON.stringify(ctx.request.header)}`, - `request: query = ${JSON.stringify(ctx.request.query)}`, - `request: params = ${JSON.stringify(ctx.params)}.`, - `response: body = ${JSON.stringify(ctx.response.body)}`, + `--> ${req.ip} -- "${req.method} ${req.path}" -- size: ${ + req.length ? bytes(req.length).toLowerCase() : 'none' + }`, + ` -> header: ${JSON.stringify(req.header)}`, + ` -> query: ${JSON.stringify(req.query)}`, + ` -> params: ${JSON.stringify(ctx.params)}`, + `<-- status: ${resp.status} -- size: ${ + resp.length ? bytes(resp.length).toLowerCase() : 'none' + }`, + ` <- header: ${JSON.stringify(resp.header)}`, ]; // Act const middleware = new AuditLoggingMiddleware({}, ''); @@ -66,16 +80,20 @@ describe('Test audit logging middlewares', () => { // Arrange const ctx: KoaContext = { ...sinon.stubInterface(), - path: faker.internet.url(), params: { uuid: faker.datatype.uuid(), }, request: { ...sinon.stubInterface(), + ip: faker.internet.ip(), + method: faker.internet.httpMethod(), + path: faker.internet.url(), + length: faker.datatype.number({ min: 100, max: 100000 }), header: { ...sinon.stubInterface(), 'X-Agent': 'test-school-client', }, + query: { ...sinon.stubInterface(), sortby: 'score', @@ -83,20 +101,29 @@ describe('Test audit logging middlewares', () => { }, response: { ...sinon.stubInterface(), + length: faker.datatype.number({ min: 100, max: 100000 }), + status: 200, body: { result: 'Success', }, }, }; + const { request: req, response: resp } = ctx; + const expected = { requestId: uuid.v4(), info: [ - `request: path = ${ctx.path}`, - `request: header = ${JSON.stringify(ctx.request.header)}`, - `request: query = ${JSON.stringify(ctx.request.query)}`, - `request: params = ${JSON.stringify(ctx.params)}.`, - `response: body = ${JSON.stringify(ctx.response.body)}`, + `--> ${req.ip} -- "${req.method} ${req.path}" -- size: ${ + req.length ? bytes(req.length).toLowerCase() : 'none' + }`, + ` -> header: ${JSON.stringify(req.header)}`, + ` -> query: ${JSON.stringify(req.query)}`, + ` -> params: ${JSON.stringify(ctx.params)}`, + `<-- status: ${resp.status} -- size: ${ + resp.length ? bytes(resp.length).toLowerCase() : 'none' + }`, + ` <- header: ${JSON.stringify(resp.header)}`, ], }; diff --git a/yarn.lock b/yarn.lock index 48debf14..9377db6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1077,6 +1077,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/bytes@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/bytes/-/bytes-3.1.1.tgz#67a876422e660dc4c10a27f3e5bcfbd5455f01d0" + integrity sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w== + "@types/chai@*": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" @@ -1954,7 +1959,7 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bytes@3.1.2: +bytes@3.1.2, bytes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== From 916da3e1d683ae60cae98140019587de4c94cddd Mon Sep 17 00:00:00 2001 From: kokokuo Date: Mon, 12 Sep 2022 18:19:48 +0800 Subject: [PATCH 2/5] chore(serve): rename "audit-log" to "access-log". - rename "AuditLoggingMiddleware" to "AccessLogMiddleware". - rename option name from "audit-log" to "access-log". - rename "AUDIT" to "ACCESS_LOG" in "getLogger" function. --- packages/core/src/lib/utils/logger.ts | 4 ++-- ...LogMiddleware.ts => accessLogMiddleware.ts} | 6 +++--- packages/serve/src/lib/middleware/index.ts | 6 +++--- ...are.spec.ts => accessLogMiddleware.spec.ts} | 18 +++++++++--------- 4 files changed, 17 insertions(+), 17 deletions(-) rename packages/serve/src/lib/middleware/{auditLogMiddleware.ts => accessLogMiddleware.ts} (89%) rename packages/serve/test/middlewares/built-in-middlewares/{auditLogMiddleware.spec.ts => accessLogMiddleware.spec.ts} (93%) diff --git a/packages/core/src/lib/utils/logger.ts b/packages/core/src/lib/utils/logger.ts index 78431c4e..ffda2842 100644 --- a/packages/core/src/lib/utils/logger.ts +++ b/packages/core/src/lib/utils/logger.ts @@ -6,7 +6,7 @@ export enum LoggingScope { CORE = 'CORE', BUILD = 'BUILD', SERVE = 'SERVE', - AUDIT = 'AUDIT', + ACCESS_LOG = 'ACCESS_LOG', } type LoggingScopeTypes = keyof typeof LoggingScope; @@ -53,7 +53,7 @@ const defaultMapConfig: LoggerMapConfig = { displayFilePath: 'hideNodeModulesOnly', displayFunctionName: true, }, - [LoggingScope.AUDIT]: { + [LoggingScope.ACCESS_LOG]: { level: LoggingLevel.DEBUG, displayRequestId: false, displayFilePath: 'hidden', diff --git a/packages/serve/src/lib/middleware/auditLogMiddleware.ts b/packages/serve/src/lib/middleware/accessLogMiddleware.ts similarity index 89% rename from packages/serve/src/lib/middleware/auditLogMiddleware.ts rename to packages/serve/src/lib/middleware/accessLogMiddleware.ts index d376ca7f..9ec9c1ac 100644 --- a/packages/serve/src/lib/middleware/auditLogMiddleware.ts +++ b/packages/serve/src/lib/middleware/accessLogMiddleware.ts @@ -6,10 +6,10 @@ import { import * as bytes from 'bytes'; import { BuiltInMiddleware, KoaContext, Next } from '@vulcan-sql/serve/models'; -@VulcanInternalExtension('audit-log') -export class AuditLoggingMiddleware extends BuiltInMiddleware { +@VulcanInternalExtension('access-log') +export class AccessLogMiddleware extends BuiltInMiddleware { private logger = getLogger({ - scopeName: 'AUDIT', + scopeName: 'ACCESS_LOG', options: this.getOptions(), }); diff --git a/packages/serve/src/lib/middleware/index.ts b/packages/serve/src/lib/middleware/index.ts index 8d64186c..dce1ccc0 100644 --- a/packages/serve/src/lib/middleware/index.ts +++ b/packages/serve/src/lib/middleware/index.ts @@ -1,6 +1,6 @@ export * from './corsMiddleware'; export * from './requestIdMiddleware'; -export * from './auditLogMiddleware'; +export * from './accessLogMiddleware'; export * from './rateLimitMiddleware'; export * from './authMiddleware'; export * from './response-format'; @@ -11,7 +11,7 @@ import { CorsMiddleware } from './corsMiddleware'; import { AuthMiddleware } from './authMiddleware'; import { RateLimitMiddleware } from './rateLimitMiddleware'; import { RequestIdMiddleware } from './requestIdMiddleware'; -import { AuditLoggingMiddleware } from './auditLogMiddleware'; +import { AccessLogMiddleware } from './accessLogMiddleware'; import { ResponseFormatMiddleware } from './response-format'; import { EnforceHttpsMiddleware } from './enforceHttpsMiddleware'; import { ClassType, ExtensionBase } from '@vulcan-sql/core'; @@ -22,7 +22,7 @@ export const BuiltInRouteMiddlewares: ClassType[] = [ CorsMiddleware, EnforceHttpsMiddleware, RequestIdMiddleware, - AuditLoggingMiddleware, + AccessLogMiddleware, RateLimitMiddleware, AuthMiddleware, ResponseFormatMiddleware, diff --git a/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts b/packages/serve/test/middlewares/built-in-middlewares/accessLogMiddleware.spec.ts similarity index 93% rename from packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts rename to packages/serve/test/middlewares/built-in-middlewares/accessLogMiddleware.spec.ts index 56180778..e2a28ea6 100644 --- a/packages/serve/test/middlewares/built-in-middlewares/auditLogMiddleware.spec.ts +++ b/packages/serve/test/middlewares/built-in-middlewares/accessLogMiddleware.spec.ts @@ -7,12 +7,12 @@ import { KoaContext } from '@vulcan-sql/serve/models'; import * as core from '@vulcan-sql/core'; import * as uuid from 'uuid'; import { - AuditLoggingMiddleware, + AccessLogMiddleware, RequestIdMiddleware, } from '@vulcan-sql/serve/middleware'; import bytes = require('bytes'); -describe('Test audit logging middlewares', () => { +describe('Test access log middlewares', () => { afterEach(() => { sinon.default.restore(); }); @@ -63,9 +63,9 @@ describe('Test audit logging middlewares', () => { ` <- header: ${JSON.stringify(resp.header)}`, ]; // Act - const middleware = new AuditLoggingMiddleware({}, ''); - // Use spy to trace the logger from getLogger( scopeName: 'AUDIT' }) to know in logger.info(...) - const spy = sinon.default.spy(core.getLogger({ scopeName: 'AUDIT' })); + const middleware = new AccessLogMiddleware({}, ''); + // Use spy to trace the logger from getLogger( scopeName: 'ACCESS_LOG' }) to know in logger.info(...) + const spy = sinon.default.spy(core.getLogger({ scopeName: 'ACCESS_LOG' })); await middleware.handle(ctx, async () => Promise.resolve()); // Assert @@ -129,7 +129,7 @@ describe('Test audit logging middlewares', () => { // setup request-id middleware run first. const stubReqIdMiddleware = new RequestIdMiddleware({}, ''); - const middleware = new AuditLoggingMiddleware( + const middleware = new AccessLogMiddleware( { options: { displayRequestId: true, @@ -137,11 +137,11 @@ describe('Test audit logging middlewares', () => { }, '' ); - // Use spy to trace the logger from getLogger( scopeName: 'AUDIT' }) to know in logger.info(...) - // it will get the setting of logger from above new audit logging middleware + // Use spy to trace the logger from getLogger( scopeName: 'ACCESS_LOG' }) to know in logger.info(...) + // it will get the setting of logger from above new ACCESS_LOG logging middleware const spy = sinon.default.spy( core.getLogger({ - scopeName: 'AUDIT', + scopeName: 'ACCESS_LOG', }) ); // Act From 5099cb465018bb02e153391ca6c3ae465a0054c3 Mon Sep 17 00:00:00 2001 From: kokokuo Date: Thu, 15 Sep 2022 14:41:43 +0800 Subject: [PATCH 3/5] fix(serve): make other scope logger also hidden the file path and function name. --- packages/core/src/lib/utils/logger.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/src/lib/utils/logger.ts b/packages/core/src/lib/utils/logger.ts index ffda2842..890dfb2c 100644 --- a/packages/core/src/lib/utils/logger.ts +++ b/packages/core/src/lib/utils/logger.ts @@ -38,20 +38,20 @@ const defaultMapConfig: LoggerMapConfig = { [LoggingScope.CORE]: { level: LoggingLevel.DEBUG, displayRequestId: false, - displayFilePath: 'hideNodeModulesOnly', - displayFunctionName: true, + displayFilePath: 'hidden', + displayFunctionName: false, }, [LoggingScope.BUILD]: { level: LoggingLevel.DEBUG, displayRequestId: false, - displayFilePath: 'hideNodeModulesOnly', - displayFunctionName: true, + displayFilePath: 'hidden', + displayFunctionName: false, }, [LoggingScope.SERVE]: { level: LoggingLevel.DEBUG, displayRequestId: false, - displayFilePath: 'hideNodeModulesOnly', - displayFunctionName: true, + displayFilePath: 'hidden', + displayFunctionName: false, }, [LoggingScope.ACCESS_LOG]: { level: LoggingLevel.DEBUG, From 18a90d778137e247c56af8a1e9caf30331fc89e6 Mon Sep 17 00:00:00 2001 From: kokokuo Date: Thu, 15 Sep 2022 14:42:32 +0800 Subject: [PATCH 4/5] fix(serve): move the access log middleware logging after other middleware ran next() --- packages/serve/src/lib/middleware/accessLogMiddleware.ts | 4 ---- packages/serve/src/lib/middleware/index.ts | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/serve/src/lib/middleware/accessLogMiddleware.ts b/packages/serve/src/lib/middleware/accessLogMiddleware.ts index 9ec9c1ac..b662313e 100644 --- a/packages/serve/src/lib/middleware/accessLogMiddleware.ts +++ b/packages/serve/src/lib/middleware/accessLogMiddleware.ts @@ -20,10 +20,6 @@ export class AccessLogMiddleware extends BuiltInMiddleware { const reqSize = req.length ? bytes(req.length).toLowerCase() : 'none'; const respSize = resp.length ? bytes(resp.length).toLowerCase() : 'none'; - /** - * TODO: The response body of our API server might be huge. - * We can let users to set what data they want to record in config in the future. - */ this.logger.info( `--> ${req.ip} -- "${req.method} ${req.path}" -- size: ${reqSize}` ); diff --git a/packages/serve/src/lib/middleware/index.ts b/packages/serve/src/lib/middleware/index.ts index dce1ccc0..ddbd10ce 100644 --- a/packages/serve/src/lib/middleware/index.ts +++ b/packages/serve/src/lib/middleware/index.ts @@ -19,10 +19,10 @@ import { DocRouterMiddleware } from './docRouterMiddleware'; // The order is the middleware running order export const BuiltInRouteMiddlewares: ClassType[] = [ + AccessLogMiddleware, CorsMiddleware, EnforceHttpsMiddleware, RequestIdMiddleware, - AccessLogMiddleware, RateLimitMiddleware, AuthMiddleware, ResponseFormatMiddleware, From 9efb93e5a140e1eb33fa155a4851c15cf87686ef Mon Sep 17 00:00:00 2001 From: kokokuo Date: Thu, 15 Sep 2022 15:29:18 +0800 Subject: [PATCH 5/5] chore(core): refactor logger to make all defined and non-defined logging scope both hide the function name and file path --- packages/core/src/lib/utils/logger.ts | 49 ++++++++------------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/packages/core/src/lib/utils/logger.ts b/packages/core/src/lib/utils/logger.ts index 890dfb2c..19b82569 100644 --- a/packages/core/src/lib/utils/logger.ts +++ b/packages/core/src/lib/utils/logger.ts @@ -30,35 +30,12 @@ export interface LoggerOptions { displayFilePath?: DisplayFilePathTypes; } -type LoggerMapConfig = { - [scope in LoggingScope]: LoggerOptions; -}; - -const defaultMapConfig: LoggerMapConfig = { - [LoggingScope.CORE]: { - level: LoggingLevel.DEBUG, - displayRequestId: false, - displayFilePath: 'hidden', - displayFunctionName: false, - }, - [LoggingScope.BUILD]: { - level: LoggingLevel.DEBUG, - displayRequestId: false, - displayFilePath: 'hidden', - displayFunctionName: false, - }, - [LoggingScope.SERVE]: { - level: LoggingLevel.DEBUG, - displayRequestId: false, - displayFilePath: 'hidden', - displayFunctionName: false, - }, - [LoggingScope.ACCESS_LOG]: { - level: LoggingLevel.DEBUG, - displayRequestId: false, - displayFilePath: 'hidden', - displayFunctionName: false, - }, +// The default logger options +const defaultLoggerOptions: LoggerOptions = { + level: LoggingLevel.DEBUG, + displayRequestId: false, + displayFilePath: 'hidden', + displayFunctionName: false, }; export type AsyncRequestIdStorage = AsyncLocalStorage<{ requestId: string }>; @@ -70,9 +47,11 @@ class LoggerFactory { this.asyncReqIdStorage = new AsyncLocalStorage(); this.loggerMap = { + // Here, create default scope logger, we could add other package or extension logger name in here [LoggingScope.CORE]: this.createLogger(LoggingScope.CORE), [LoggingScope.BUILD]: this.createLogger(LoggingScope.BUILD), [LoggingScope.SERVE]: this.createLogger(LoggingScope.SERVE), + [LoggingScope.ACCESS_LOG]: this.createLogger(LoggingScope.ACCESS_LOG), }; } @@ -96,7 +75,7 @@ class LoggerFactory { return logger; } // if scope name does not exist in map or exist but would like to update config - const newLogger = this.createLogger(scopeName as LoggingScope, options); + const newLogger = this.createLogger(scopeName, options); this.loggerMap[scopeName] = newLogger; return newLogger; } @@ -113,19 +92,19 @@ class LoggerFactory { }); } - private createLogger(name: LoggingScope, options?: LoggerOptions) { + private createLogger(name: string, options?: LoggerOptions) { return new Logger({ name, - minLevel: options?.level || defaultMapConfig[name].level, + minLevel: options?.level || defaultLoggerOptions.level, // use function call for requestId, then when logger get requestId, it will get newest store again requestId: () => this.asyncReqIdStorage.getStore()?.requestId as string, displayRequestId: - options?.displayRequestId || defaultMapConfig[name].displayRequestId, + options?.displayRequestId || defaultLoggerOptions.displayRequestId, displayFunctionName: options?.displayFunctionName || - defaultMapConfig[name].displayFunctionName, + defaultLoggerOptions.displayFunctionName, displayFilePath: - options?.displayFilePath || defaultMapConfig[name].displayFilePath, + options?.displayFilePath || defaultLoggerOptions.displayFilePath, }); } }