From a2df25e7fa624ece234d29b9eb1f469c55f365bf Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Wed, 21 Jul 2021 08:32:23 +0530 Subject: [PATCH 01/13] Adds custom logger --- __tests__/logger.test.ts | 22 ++++++++++++++++++++++ src/cli/commands/list.ts | 12 ++++++------ src/cli/commands/start.ts | 3 ++- src/cli/commands/subscriptions.ts | 9 +++++---- src/client/googlePubSub.ts | 25 ++++++++++++++----------- src/service/logger.ts | 18 ++++++++++++++++++ src/service/pubsub.ts | 5 +++-- src/service/subscription.ts | 5 +++-- 8 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 __tests__/logger.test.ts create mode 100644 src/service/logger.ts diff --git a/__tests__/logger.test.ts b/__tests__/logger.test.ts new file mode 100644 index 00000000..779d2e75 --- /dev/null +++ b/__tests__/logger.test.ts @@ -0,0 +1,22 @@ +import { Logger } from '../src/service/logger'; + +describe('Tests Logger singleton', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it('Should return default Logger instance if not provided anything', () => { + expect(Logger.Instance).toBeTruthy(); + }); + it("Should return what's passed in", () => { + const customLogger = { info: jest.fn() } as any; + Logger.Instance = customLogger; + expect(Logger.Instance).toEqual(customLogger); + }); + it('Should return latest logger passed in', () => { + const customLogger = { info: jest.fn() } as any; + const customLogger1 = { info: jest.fn() } as any; + Logger.Instance = customLogger; + Logger.Instance = customLogger1; + expect(Logger.Instance).toEqual(customLogger1); + }); +}); diff --git a/src/cli/commands/list.ts b/src/cli/commands/list.ts index dca775cc..93e14579 100644 --- a/src/cli/commands/list.ts +++ b/src/cli/commands/list.ts @@ -1,6 +1,7 @@ import chalk from 'chalk'; import { cli } from 'cli-ux'; import wrapAnsi = require('wrap-ansi'); +import { Logger } from '../../service/logger'; import { PubSubService } from '../../index'; import { SubscriberTuple } from '../../subscriber'; @@ -8,12 +9,11 @@ export default { command: 'list', desc: 'Lists all subscriptions', handler: async (): Promise => { - console.log( - chalk.white.bgBlue.bold('\n Google Pub/Sub Subscriptions'), - '\n', + Logger.Instance.info( + chalk.white.bgBlue.bold('\n Google Pub/Sub Subscriptions \n'), ); if (PubSubService.getInstance().getSubscribers().length == 0) { - console.log(chalk.white.bold('\n No subscriptions found')); + Logger.Instance.info(chalk.white.bold('\n No subscriptions found')); } else { cli.table( PubSubService.getInstance().getSubscribers(), @@ -30,10 +30,10 @@ export default { }, }, { - printLine: console.log, + printLine: Logger.Instance.info, }, ); - console.log('\n'); + Logger.Instance.info('\n'); process.exit(0); } }, diff --git a/src/cli/commands/start.ts b/src/cli/commands/start.ts index dd1319f6..6d3b47b1 100644 --- a/src/cli/commands/start.ts +++ b/src/cli/commands/start.ts @@ -1,11 +1,12 @@ import chalk from 'chalk'; +import { Logger } from '../../service/logger'; import { PubSubService } from '../../index'; export default { command: 'start', desc: 'Will listen to Google Pub/Sub topics and initialize their event handlers', handler: async (_argv: unknown): Promise => { - console.log( + Logger.Instance.info( chalk.bold.blue('Starting Google Pub/Sub Subscriptions Server'), ); return PubSubService.getInstance().startSubscriptions(); diff --git a/src/cli/commands/subscriptions.ts b/src/cli/commands/subscriptions.ts index b24f51d7..18114514 100644 --- a/src/cli/commands/subscriptions.ts +++ b/src/cli/commands/subscriptions.ts @@ -1,17 +1,18 @@ require('dotenv').config({ path: require('find-config')('.env') }); import chalk from 'chalk'; import { cli } from 'cli-ux'; +import { Logger } from '../../service/logger'; import { PubSubService } from '../../index'; export default { command: 'subscriptions', desc: 'Lists all subscriptions', handler: async (): Promise => { - console.log(chalk.white.bgBlue.bold('\n All Subscriptions'), '\n'); + Logger.Instance.info(chalk.white.bgBlue.bold('\n All Subscriptions'), '\n'); const subscriptions = await PubSubService.getInstance().getAllSubscriptions(); if (subscriptions.length == 0) { - console.log(chalk.white.bold('\n No subscriptions found')); + Logger.Instance.info(chalk.white.bold('\n No subscriptions found')); } else { cli.table( subscriptions, @@ -24,10 +25,10 @@ export default { }, }, { - printLine: console.log, + printLine: Logger.Instance.info, }, ); - console.log('\n'); + Logger.Instance.info('\n'); } }, }; diff --git a/src/client/googlePubSub.ts b/src/client/googlePubSub.ts index 699f97cd..28396ce3 100644 --- a/src/client/googlePubSub.ts +++ b/src/client/googlePubSub.ts @@ -20,6 +20,7 @@ import { import { SubscriberTuple } from '../subscriber'; import Message from '../message'; import { GooglePubSubProject } from '../interface/GooglePubSubProject'; +import { Logger } from '../service/logger'; export interface Project { client: GooglePubSub; @@ -130,7 +131,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { } private log(message: string): void { - console.log(chalk.green.bold(message)); + Logger.Instance.info(chalk.green.bold(message)); } private getSubscriberOptions( @@ -169,7 +170,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { }); if (await this.subscriptionExists(metadata.subscriptionName, client)) { - console.log( + Logger.Instance.info( chalk.gray(` ✔️ ${metadata.subscriptionName} already exists.`), ); await this.updateMetaData(subscriber); @@ -210,7 +211,8 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { }, }); } catch (e) { - console.error( + Logger.Instance.error( + e, `Error while creating default deadLetter subscription for ${metadata.subscriptionName}`, ); } @@ -238,11 +240,12 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { metadata.subscriptionName, await this.getMergedSubscriptionOptions(subscriber), ); - console.log( + Logger.Instance.info( chalk.gray(` ✔️ ${metadata.subscriptionName} created.`), ); } catch (e) { - console.error( + Logger.Instance.error( + e, ` ❌ There was an error creating "${metadata.subscriptionName}" subscription.`, e, ); @@ -286,7 +289,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { .topic(deadLetterTopic) .getSubscriptions(); if (subscriptions.length === 0) { - console.warn( + Logger.Instance.warn( `Please set createDefaultSubscription: true in deadLetterPolicy to create default subscriber for dead letter topic of ${metadata.subscriptionName}. Ignore if already added subscription for it.`, ); } @@ -326,7 +329,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { // project.info return [_, projectInfoIncludingProjectNumber] return (projectInfo as any)[1]?.projectNumber; } catch (e) { - console.error('Error while getting project number', e); + Logger.Instance.error('Error while getting project number', e); return ''; } } @@ -360,9 +363,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { .subscription(subscriptionName) .iam.setPolicy(myPolicy); } catch (e) { - console.error( - ` ❌ Error while binding policy for "${metadata.subscriptionName}" subscription.`, + Logger.Instance.error( e, + ` ❌ Error while binding policy for "${metadata.subscriptionName}" subscription.`, ); } } @@ -390,9 +393,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { }; await pubSubTopic.iam.setPolicy(myPolicy); } catch (e) { - console.error( - ` ❌ Error while binding policy for "${deadLetterTopicName}" DLQ topic.`, + Logger.Instance.error( e, + ` ❌ Error while binding policy for "${deadLetterTopicName}" DLQ topic.`, ); } } diff --git a/src/service/logger.ts b/src/service/logger.ts new file mode 100644 index 00000000..8365b637 --- /dev/null +++ b/src/service/logger.ts @@ -0,0 +1,18 @@ +export interface LoggerOptions { + info: (...args: any[]) => void; + debug: (...args: any[]) => void; + error: (...args: any[]) => void; + warn: (...args: any[]) => void; +} +export class Logger { + private static logger: LoggerOptions; + public static set Instance(logger: LoggerOptions) { + Logger.logger = logger; + } + public static get Instance(): LoggerOptions { + if (!Logger.logger) { + Logger.logger = console; + } + return Logger.logger; + } +} diff --git a/src/service/pubsub.ts b/src/service/pubsub.ts index 9bb73cb0..ce765312 100644 --- a/src/service/pubsub.ts +++ b/src/service/pubsub.ts @@ -5,6 +5,7 @@ import { AllSubscriptions, PubSubClientV2 } from '../interface/pubSubClient'; import GooglePubSubAdapter from '../client/googlePubSub'; import { PublishOptions } from '../interface/publishOptions'; import SubscriptionService from './subscription'; +import { Logger } from './logger'; export default class PubSubService { protected static client: PubSubClientV2; @@ -102,7 +103,7 @@ export default class PubSubService { await this.subscribe(subscription); } catch (err) { const [, metadata] = subscription; - console.error( + Logger.Instance.error( ` ❌ Error while initializing "${metadata.subscriptionName}" subscription.`, ); const error: Error & { @@ -116,7 +117,7 @@ export default class PubSubService { } PubSubService.status = 'ready'; - console.log(` ✅ All subscriptions started successfully.`); + Logger.Instance.info(` ✅ All subscriptions started successfully.`); } /** diff --git a/src/service/subscription.ts b/src/service/subscription.ts index b3008e69..cc28bc1c 100644 --- a/src/service/subscription.ts +++ b/src/service/subscription.ts @@ -9,6 +9,7 @@ import { } from '../subscriber'; import SubscriberLoader from './subscriberLoader'; import { ResourceResolver } from './resourceResolver'; +import { Logger } from './logger'; export default class SubscriptionService { public static subscribers: ( @@ -21,7 +22,7 @@ export default class SubscriptionService { public static defaultSubscriberOptions: SubscriberOptions; public static instance = new SubscriptionService(); - + public logger = Logger.Instance; public constructor() { this.checkExistence(process.env, 'PUBSUB_ROOT_DIR'); } @@ -31,7 +32,7 @@ export default class SubscriptionService { !object.hasOwnProperty(property) || (object.hasOwnProperty(property) && object[property] == '') ) { - console.warn( + Logger.Instance.warn( `@honestfoodcompany/pubsub module requires ${property} to be defined in your .env`, ); } From 1f2896435828e656623b4a264bc65af41f75bb70 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Wed, 21 Jul 2021 16:02:44 +0530 Subject: [PATCH 02/13] Made debug optional as it isn't being used Added description in readme for passing logger --- README.md | 7 +++++++ src/service/logger.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 07db904f..6a6f534e 100644 --- a/README.md +++ b/README.md @@ -453,6 +453,13 @@ import * as PubSub from '@honestfoodcompany/pubsub'; import { SubscriberOptions } from '@honestfoodcompany/pubsub'; export default class SubscriptionService extends PubSub.SubscriptionService { + /** + * This variable definition is optional, you can pass an instance of Pino, Winston logger + * By default it uses default console.* for logging + * The logger you pass must support .error, .info and .warn methods for it to work + */ + logger = console; + static subscribers = [ /** * if your subscribers don't have the .sub.js suffix diff --git a/src/service/logger.ts b/src/service/logger.ts index 8365b637..d4b850f6 100644 --- a/src/service/logger.ts +++ b/src/service/logger.ts @@ -1,6 +1,6 @@ export interface LoggerOptions { info: (...args: any[]) => void; - debug: (...args: any[]) => void; + debug?: (...args: any[]) => void; error: (...args: any[]) => void; warn: (...args: any[]) => void; } From d2881d9be75a0b7581bc47be03cd994ea8e2e77e Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 09:02:36 +0530 Subject: [PATCH 03/13] Fixes --- __tests__/logger.test.ts | 6 ++++++ src/service/subscription.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/__tests__/logger.test.ts b/__tests__/logger.test.ts index 779d2e75..9e3cfba5 100644 --- a/__tests__/logger.test.ts +++ b/__tests__/logger.test.ts @@ -1,3 +1,4 @@ +import SubscriptionService from '../src/service/subscription'; import { Logger } from '../src/service/logger'; describe('Tests Logger singleton', () => { @@ -19,4 +20,9 @@ describe('Tests Logger singleton', () => { Logger.Instance = customLogger1; expect(Logger.Instance).toEqual(customLogger1); }); + it('Should overwrite logger instance from Subscription Service', () => { + const customLogger = { info: jest.fn(), debug: jest.fn() } as any; + SubscriptionService.setLogger(customLogger); + expect(Logger.Instance).toStrictEqual(customLogger); + }); }); diff --git a/src/service/subscription.ts b/src/service/subscription.ts index cc28bc1c..5980b8e2 100644 --- a/src/service/subscription.ts +++ b/src/service/subscription.ts @@ -9,7 +9,7 @@ import { } from '../subscriber'; import SubscriberLoader from './subscriberLoader'; import { ResourceResolver } from './resourceResolver'; -import { Logger } from './logger'; +import { Logger, LoggerOptions } from './logger'; export default class SubscriptionService { public static subscribers: ( @@ -22,7 +22,11 @@ export default class SubscriptionService { public static defaultSubscriberOptions: SubscriberOptions; public static instance = new SubscriptionService(); - public logger = Logger.Instance; + + public static setLogger(logger: LoggerOptions): void { + Logger.Instance = logger; + } + public constructor() { this.checkExistence(process.env, 'PUBSUB_ROOT_DIR'); } From da22967d9f06d41ccb359b3fd236c77a9ab52cac Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 09:36:28 +0530 Subject: [PATCH 04/13] Logs fixes --- src/cli/commands/list.ts | 2 +- src/cli/commands/subscriptions.ts | 2 +- src/client/googlePubSub.ts | 8 +++++--- src/service/pubsub.ts | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cli/commands/list.ts b/src/cli/commands/list.ts index 93e14579..a8057b6b 100644 --- a/src/cli/commands/list.ts +++ b/src/cli/commands/list.ts @@ -13,7 +13,7 @@ export default { chalk.white.bgBlue.bold('\n Google Pub/Sub Subscriptions \n'), ); if (PubSubService.getInstance().getSubscribers().length == 0) { - Logger.Instance.info(chalk.white.bold('\n No subscriptions found')); + Logger.Instance.warn(chalk.white.bold('\n No subscriptions found')); } else { cli.table( PubSubService.getInstance().getSubscribers(), diff --git a/src/cli/commands/subscriptions.ts b/src/cli/commands/subscriptions.ts index 18114514..76ba7180 100644 --- a/src/cli/commands/subscriptions.ts +++ b/src/cli/commands/subscriptions.ts @@ -12,7 +12,7 @@ export default { const subscriptions = await PubSubService.getInstance().getAllSubscriptions(); if (subscriptions.length == 0) { - Logger.Instance.info(chalk.white.bold('\n No subscriptions found')); + Logger.Instance.warn(chalk.white.bold('\n No subscriptions found')); } else { cli.table( subscriptions, diff --git a/src/client/googlePubSub.ts b/src/client/googlePubSub.ts index 28396ce3..491c28a5 100644 --- a/src/client/googlePubSub.ts +++ b/src/client/googlePubSub.ts @@ -171,6 +171,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { if (await this.subscriptionExists(metadata.subscriptionName, client)) { Logger.Instance.info( + metadata, chalk.gray(` ✔️ ${metadata.subscriptionName} already exists.`), ); await this.updateMetaData(subscriber); @@ -241,13 +242,13 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { await this.getMergedSubscriptionOptions(subscriber), ); Logger.Instance.info( + metadata, chalk.gray(` ✔️ ${metadata.subscriptionName} created.`), ); } catch (e) { Logger.Instance.error( - e, + { ...metadata, err: e }, ` ❌ There was an error creating "${metadata.subscriptionName}" subscription.`, - e, ); } } @@ -290,6 +291,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { .getSubscriptions(); if (subscriptions.length === 0) { Logger.Instance.warn( + metadata, `Please set createDefaultSubscription: true in deadLetterPolicy to create default subscriber for dead letter topic of ${metadata.subscriptionName}. Ignore if already added subscription for it.`, ); } @@ -329,7 +331,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { // project.info return [_, projectInfoIncludingProjectNumber] return (projectInfo as any)[1]?.projectNumber; } catch (e) { - Logger.Instance.error('Error while getting project number', e); + Logger.Instance.error(e, 'Error while getting project number', e); return ''; } } diff --git a/src/service/pubsub.ts b/src/service/pubsub.ts index ce765312..f418fc87 100644 --- a/src/service/pubsub.ts +++ b/src/service/pubsub.ts @@ -104,6 +104,7 @@ export default class PubSubService { } catch (err) { const [, metadata] = subscription; Logger.Instance.error( + err, ` ❌ Error while initializing "${metadata.subscriptionName}" subscription.`, ); const error: Error & { From d4fda80555a74427b02fea4c3917e25fda654869 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 09:39:09 +0530 Subject: [PATCH 05/13] docs(changeset): Added option to add custom logger --- .changeset/witty-ways-repeat.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/witty-ways-repeat.md diff --git a/.changeset/witty-ways-repeat.md b/.changeset/witty-ways-repeat.md new file mode 100644 index 00000000..1152e465 --- /dev/null +++ b/.changeset/witty-ways-repeat.md @@ -0,0 +1,5 @@ +--- +'@honestfoodcompany/pubsub': patch +--- + +Added option to add custom logger From 9444d1e5e41207ba5f720fed99530229475a32e7 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 10:20:02 +0530 Subject: [PATCH 06/13] Updated Readme --- README.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d91ab2cb..0dc305f8 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ This package contains a lightweight framework and subscription server for [Googl - [Typescript example](#typescript-example-1) - [Javascript Example](#javascript-example-1) - [Graceful Shutdown](#graceful-shutdown) + - [Passing a custom Logger](#passing-a-custom-logger) - [Connecting to a database](#connecting-to-a-database) - [Enabling Synchronous Driver](#enabling-synchronous-driver) - [Enabling gRPC C++ bindings](#enabling-grpc-c-bindings) @@ -453,14 +454,14 @@ Extend and customize the behavior of the subscription server in the subscription import * as PubSub from '@honestfoodcompany/pubsub'; import { SubscriberOptions } from '@honestfoodcompany/pubsub'; -export default class SubscriptionService extends PubSub.SubscriptionService { - /** - * This variable definition is optional, you can pass an instance of Pino, Winston logger - * By default it uses default console.* for logging - * The logger you pass must support .error, .info and .warn methods for it to work - */ - logger = console; +/** + * This variable definition is optional, you can pass an instance of Pino, Winston logger + * By default it uses default console.* for logging + * The logger you pass must support .error, .info and .warn methods for it to work + */ +PubSub.SubscriptionService.logger = console; +export default class SubscriptionService extends PubSub.SubscriptionService { static subscribers = [ /** * if your subscribers don't have the .sub.js suffix @@ -518,6 +519,14 @@ SubscriptionService.init = () => { exports.default = SubscriptionService; ``` +### Passing a custom Logger + +In the main SubscriptionService before defining subscription class you can update the logger that is being used by the package for logging. It's an optional definition and by default it uses `console.*` for logging `.info`, `.warn` and `.error` these 3 function keys are a must have for the logger you pass. + +``` +SubscriptionService.logger = console; +``` + ### Connecting to a database It is recommended to initialize a database connection in the `subscription.service` file in your `PUBSUB_ROOT_DIR`. Insert your database connection logic in the `init` method. From 18f39bad07dea7e4662ef99a405f0adff6c66038 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 10:25:49 +0530 Subject: [PATCH 07/13] Message fixes --- src/client/googlePubSub.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/client/googlePubSub.ts b/src/client/googlePubSub.ts index 491c28a5..8f9faa55 100644 --- a/src/client/googlePubSub.ts +++ b/src/client/googlePubSub.ts @@ -211,9 +211,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { ttl: null, }, }); - } catch (e) { + } catch (err) { Logger.Instance.error( - e, + { metadata, err }, `Error while creating default deadLetter subscription for ${metadata.subscriptionName}`, ); } @@ -307,6 +307,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { await this.bindPolicyToDeadLetterTopic( options.deadLetterPolicy.deadLetterTopic, options, + metadata, ); if (options?.deadLetterPolicy?.createDefaultSubscription) { await this.createDeadLetterDefaultSubscriber(subscriber); @@ -364,9 +365,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { await pubSubTopic .subscription(subscriptionName) .iam.setPolicy(myPolicy); - } catch (e) { + } catch (err) { Logger.Instance.error( - e, + { metadata, err }, ` ❌ Error while binding policy for "${metadata.subscriptionName}" subscription.`, ); } @@ -375,7 +376,8 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { private async bindPolicyToDeadLetterTopic( deadLetterTopicName: string, - options?: { project?: GooglePubSubProject }, + options: { project?: GooglePubSubProject }, + metadata: SubscriberMetadata, ): Promise { const projectNumber = await this.getProjectNumber(); @@ -394,9 +396,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { ], }; await pubSubTopic.iam.setPolicy(myPolicy); - } catch (e) { + } catch (err) { Logger.Instance.error( - e, + { metadata, err }, ` ❌ Error while binding policy for "${deadLetterTopicName}" DLQ topic.`, ); } From 79e9b8f3c78c26696f2920f8bc1b85e646100c0c Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 10:56:32 +0530 Subject: [PATCH 08/13] Fixes readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0dc305f8..fe8d4feb 100644 --- a/README.md +++ b/README.md @@ -455,11 +455,11 @@ import * as PubSub from '@honestfoodcompany/pubsub'; import { SubscriberOptions } from '@honestfoodcompany/pubsub'; /** - * This variable definition is optional, you can pass an instance of Pino, Winston logger + * This function call is optional, you can pass an instance of Pino, Winston logger * By default it uses default console.* for logging * The logger you pass must support .error, .info and .warn methods for it to work */ -PubSub.SubscriptionService.logger = console; +PubSub.SubscriptionService.setLogger(console); export default class SubscriptionService extends PubSub.SubscriptionService { static subscribers = [ @@ -524,7 +524,7 @@ exports.default = SubscriptionService; In the main SubscriptionService before defining subscription class you can update the logger that is being used by the package for logging. It's an optional definition and by default it uses `console.*` for logging `.info`, `.warn` and `.error` these 3 function keys are a must have for the logger you pass. ``` -SubscriptionService.logger = console; +SubscriptionService.setLogger(console); ``` ### Connecting to a database From 3efd895fca73e03c4ef9869008346d2c49f89ffa Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 11:19:46 +0530 Subject: [PATCH 09/13] Fixes the exposed function used for setting logger --- README.md | 10 ++++++++-- __tests__/logger.test.ts | 5 ++--- src/index.ts | 2 ++ src/service/logger.ts | 3 +++ src/service/subscription.ts | 6 +----- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index fe8d4feb..61a6f8d2 100644 --- a/README.md +++ b/README.md @@ -459,7 +459,7 @@ import { SubscriberOptions } from '@honestfoodcompany/pubsub'; * By default it uses default console.* for logging * The logger you pass must support .error, .info and .warn methods for it to work */ -PubSub.SubscriptionService.setLogger(console); +PubSub.setLogger(console); export default class SubscriptionService extends PubSub.SubscriptionService { static subscribers = [ @@ -523,8 +523,14 @@ exports.default = SubscriptionService; In the main SubscriptionService before defining subscription class you can update the logger that is being used by the package for logging. It's an optional definition and by default it uses `console.*` for logging `.info`, `.warn` and `.error` these 3 function keys are a must have for the logger you pass. +```typescript +import { setLogger } from '@honestfoodcompany/pubsub'; +setLogger(console); ``` -SubscriptionService.setLogger(console); + +```javascript +const { setLogger } = require('@honestfoodcompany/pubsub'); +setLogger(console); ``` ### Connecting to a database diff --git a/__tests__/logger.test.ts b/__tests__/logger.test.ts index 9e3cfba5..9aa411e6 100644 --- a/__tests__/logger.test.ts +++ b/__tests__/logger.test.ts @@ -1,5 +1,4 @@ -import SubscriptionService from '../src/service/subscription'; -import { Logger } from '../src/service/logger'; +import { Logger, setLogger } from '../src/service/logger'; describe('Tests Logger singleton', () => { beforeEach(() => { @@ -22,7 +21,7 @@ describe('Tests Logger singleton', () => { }); it('Should overwrite logger instance from Subscription Service', () => { const customLogger = { info: jest.fn(), debug: jest.fn() } as any; - SubscriptionService.setLogger(customLogger); + setLogger(customLogger); expect(Logger.Instance).toStrictEqual(customLogger); }); }); diff --git a/src/index.ts b/src/index.ts index ec1dd554..3b939ac1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import Subscriber, { } from './subscriber'; import SubscriptionService from './service/subscription'; import PubSubService from './service/pubsub'; +import { setLogger } from './service/logger'; import Message from './message'; import * as Interfaces from './interface'; @@ -21,4 +22,5 @@ export { SubscriberObject, SubscriberV2, SubscriberOptions, + setLogger, }; diff --git a/src/service/logger.ts b/src/service/logger.ts index d4b850f6..3b74c931 100644 --- a/src/service/logger.ts +++ b/src/service/logger.ts @@ -16,3 +16,6 @@ export class Logger { return Logger.logger; } } +export const setLogger = (logger: LoggerOptions): void => { + Logger.Instance = logger; +}; diff --git a/src/service/subscription.ts b/src/service/subscription.ts index 5980b8e2..3a3d8b8a 100644 --- a/src/service/subscription.ts +++ b/src/service/subscription.ts @@ -9,7 +9,7 @@ import { } from '../subscriber'; import SubscriberLoader from './subscriberLoader'; import { ResourceResolver } from './resourceResolver'; -import { Logger, LoggerOptions } from './logger'; +import { Logger } from './logger'; export default class SubscriptionService { public static subscribers: ( @@ -23,10 +23,6 @@ export default class SubscriptionService { public static instance = new SubscriptionService(); - public static setLogger(logger: LoggerOptions): void { - Logger.Instance = logger; - } - public constructor() { this.checkExistence(process.env, 'PUBSUB_ROOT_DIR'); } From b804c9380f66c7641a1a75fcd1f540bc54114fb0 Mon Sep 17 00:00:00 2001 From: Ishan Mahajan Date: Thu, 22 Jul 2021 11:24:53 +0530 Subject: [PATCH 10/13] Update .changeset/witty-ways-repeat.md Co-authored-by: Rohit Gohri --- .changeset/witty-ways-repeat.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/witty-ways-repeat.md b/.changeset/witty-ways-repeat.md index 1152e465..b0f832ff 100644 --- a/.changeset/witty-ways-repeat.md +++ b/.changeset/witty-ways-repeat.md @@ -2,4 +2,4 @@ '@honestfoodcompany/pubsub': patch --- -Added option to add custom logger +Added option to add custom logger - PUB-44 From 009ae5841a22f0b71ab9506f0a68e9f304b41c09 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 11:29:09 +0530 Subject: [PATCH 11/13] Consistent metadat logging --- src/client/googlePubSub.ts | 8 ++++---- src/service/pubsub.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/client/googlePubSub.ts b/src/client/googlePubSub.ts index 8f9faa55..d67ae8c4 100644 --- a/src/client/googlePubSub.ts +++ b/src/client/googlePubSub.ts @@ -171,7 +171,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { if (await this.subscriptionExists(metadata.subscriptionName, client)) { Logger.Instance.info( - metadata, + { metadata }, chalk.gray(` ✔️ ${metadata.subscriptionName} already exists.`), ); await this.updateMetaData(subscriber); @@ -242,12 +242,12 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { await this.getMergedSubscriptionOptions(subscriber), ); Logger.Instance.info( - metadata, + { metadata }, chalk.gray(` ✔️ ${metadata.subscriptionName} created.`), ); } catch (e) { Logger.Instance.error( - { ...metadata, err: e }, + { metadata, err: e }, ` ❌ There was an error creating "${metadata.subscriptionName}" subscription.`, ); } @@ -291,7 +291,7 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { .getSubscriptions(); if (subscriptions.length === 0) { Logger.Instance.warn( - metadata, + { metadata }, `Please set createDefaultSubscription: true in deadLetterPolicy to create default subscriber for dead letter topic of ${metadata.subscriptionName}. Ignore if already added subscription for it.`, ); } diff --git a/src/service/pubsub.ts b/src/service/pubsub.ts index f418fc87..5c6eddaf 100644 --- a/src/service/pubsub.ts +++ b/src/service/pubsub.ts @@ -104,7 +104,7 @@ export default class PubSubService { } catch (err) { const [, metadata] = subscription; Logger.Instance.error( - err, + { metadata, err }, ` ❌ Error while initializing "${metadata.subscriptionName}" subscription.`, ); const error: Error & { From 6893bb3d04a24e08b3b0ff90a5b359f7ce41135b Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 11:33:31 +0530 Subject: [PATCH 12/13] Consistent .error --- src/client/googlePubSub.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/googlePubSub.ts b/src/client/googlePubSub.ts index d67ae8c4..b3c2d1f3 100644 --- a/src/client/googlePubSub.ts +++ b/src/client/googlePubSub.ts @@ -245,9 +245,9 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { { metadata }, chalk.gray(` ✔️ ${metadata.subscriptionName} created.`), ); - } catch (e) { + } catch (err) { Logger.Instance.error( - { metadata, err: e }, + { metadata, err }, ` ❌ There was an error creating "${metadata.subscriptionName}" subscription.`, ); } @@ -331,8 +331,8 @@ export default class GooglePubSubAdapter implements PubSubClientV2 { const projectInfo = await project.get(); // project.info return [_, projectInfoIncludingProjectNumber] return (projectInfo as any)[1]?.projectNumber; - } catch (e) { - Logger.Instance.error(e, 'Error while getting project number', e); + } catch (err) { + Logger.Instance.error({ err }, 'Error while getting project number'); return ''; } } From f0b8a909b4b6c9e8c5b515e98fb53aca7d33c243 Mon Sep 17 00:00:00 2001 From: ishanmahajan1 Date: Thu, 22 Jul 2021 11:47:59 +0530 Subject: [PATCH 13/13] Changed to minor update --- .changeset/witty-ways-repeat.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/witty-ways-repeat.md b/.changeset/witty-ways-repeat.md index b0f832ff..8fa0c11f 100644 --- a/.changeset/witty-ways-repeat.md +++ b/.changeset/witty-ways-repeat.md @@ -1,5 +1,5 @@ --- -'@honestfoodcompany/pubsub': patch +'@honestfoodcompany/pubsub': minor --- Added option to add custom logger - PUB-44