diff --git a/src/index.ts b/src/index.ts index 6353419ad..237218c39 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,9 @@ import { getErrorMessage } from '@defra/forms-model' import { config } from '~/src/config/index.js' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { createServer } from '~/src/server/index.js' -const logger = createLogger() - process.on('unhandledRejection', (error) => { const err = getErrorMessage(error) logger.info('Unhandled rejection') diff --git a/src/server/common/helpers/logging/logger.ts b/src/server/common/helpers/logging/logger.ts index 14117d479..f7bc8fe68 100644 --- a/src/server/common/helpers/logging/logger.ts +++ b/src/server/common/helpers/logging/logger.ts @@ -2,6 +2,10 @@ import { pino } from 'pino' import { loggerOptions } from '~/src/server/common/helpers/logging/logger-options.js' -export function createLogger() { +function createPinoLogger() { return pino(loggerOptions) } + +// Singleton logger instance - pino adds 'exit' listeners to process, +// so we reuse a single instance to avoid MaxListenersExceededWarning +export const logger = createPinoLogger() diff --git a/src/server/common/helpers/redis-client.js b/src/server/common/helpers/redis-client.js index e080c0926..24f50f218 100644 --- a/src/server/common/helpers/redis-client.js +++ b/src/server/common/helpers/redis-client.js @@ -2,7 +2,7 @@ import { getErrorMessage } from '@defra/forms-model' import { Cluster, Redis } from 'ioredis' import { config } from '~/src/config/index.js' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' /** * Setup Redis and provide a redis client @@ -11,8 +11,6 @@ import { createLogger } from '~/src/server/common/helpers/logging/logger.js' * Out in the wild - Elasticache / Redis Cluster with username and password */ export function buildRedisClient() { - const logger = createLogger() - const port = 6379 const db = 0 const redisConfig = config.get('redis') diff --git a/src/server/plugins/engine/components/PaymentField.ts b/src/server/plugins/engine/components/PaymentField.ts index bb2815805..494995092 100644 --- a/src/server/plugins/engine/components/PaymentField.ts +++ b/src/server/plugins/engine/components/PaymentField.ts @@ -7,7 +7,7 @@ import { import { StatusCodes } from 'http-status-codes' import joi, { type ObjectSchema } from 'joi' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { COMPONENT_STATE_ERROR } from '~/src/server/constants.js' import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js' import { type PaymentState } from '~/src/server/plugins/engine/components/PaymentField.types.js' @@ -40,8 +40,6 @@ import { formatCurrency } from '~/src/server/plugins/payment/helper.js' -const logger = createLogger() - export class PaymentField extends FormComponent { declare options: PaymentFieldComponent['options'] declare formSchema: ObjectSchema diff --git a/src/server/plugins/engine/helpers.ts b/src/server/plugins/engine/helpers.ts index 14c060adf..3be9f98bd 100644 --- a/src/server/plugins/engine/helpers.ts +++ b/src/server/plugins/engine/helpers.ts @@ -15,7 +15,7 @@ import { StatusCodes } from 'http-status-codes' import { type Schema, type ValidationErrorItem } from 'joi' import { Liquid } from 'liquidjs' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { FORM_VERSION_METADATA_KEY } from '~/src/server/constants.js' import { getAnswer, @@ -37,8 +37,6 @@ import { type FormResponseToolkit } from '~/src/server/routes/types.js' -const logger = createLogger() - export const engine = new Liquid({ outputEscape: 'escape', jsTruthy: true, diff --git a/src/server/plugins/engine/models/FormModel.ts b/src/server/plugins/engine/models/FormModel.ts index 87c2e6d57..30f6c2463 100644 --- a/src/server/plugins/engine/models/FormModel.ts +++ b/src/server/plugins/engine/models/FormModel.ts @@ -28,7 +28,7 @@ import { add, format } from 'date-fns' import { Parser, type Value } from 'expr-eval-fork' import joi from 'joi' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { type ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js' import {} from '~/src/server/plugins/engine/components/YesNoField.js' import { @@ -61,8 +61,6 @@ import { FormAction } from '~/src/server/routes/types.js' import { merge } from '~/src/server/services/cacheService.js' import { type Services } from '~/src/server/types.js' -const logger = createLogger() - export class FormModel { /** The runtime engine that should be used */ engine?: Engine diff --git a/src/server/plugins/engine/options.js b/src/server/plugins/engine/options.js index 04774b47b..2c7a73520 100644 --- a/src/server/plugins/engine/options.js +++ b/src/server/plugins/engine/options.js @@ -1,11 +1,9 @@ import { getErrorMessage } from '@defra/forms-model' import Joi from 'joi' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { CacheService } from '~/src/server/services/index.js' -const logger = createLogger() - const pluginRegistrationOptionsSchema = Joi.object({ model: Joi.object().optional(), services: Joi.object().optional(), diff --git a/src/server/plugins/engine/routes/payment.js b/src/server/plugins/engine/routes/payment.js index 692f623fe..b5440ce07 100644 --- a/src/server/plugins/engine/routes/payment.js +++ b/src/server/plugins/engine/routes/payment.js @@ -2,7 +2,7 @@ import Boom from '@hapi/boom' import { StatusCodes } from 'http-status-codes' import Joi from 'joi' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { EXTERNAL_STATE_APPENDAGE } from '~/src/server/constants.js' import { getPluginOptions } from '~/src/server/plugins/engine/helpers.js' import { @@ -14,8 +14,6 @@ import { export const PAYMENT_RETURN_PATH = '/payment-callback' export const PAYMENT_SESSION_PREFIX = 'payment-' -const logger = createLogger() - /** * Flash form component state after successful payment * @param {Request} request - the request diff --git a/src/server/plugins/map/service.js b/src/server/plugins/map/service.js index 68d4156fb..e8679225d 100644 --- a/src/server/plugins/map/service.js +++ b/src/server/plugins/map/service.js @@ -1,11 +1,9 @@ import { getErrorMessage } from '@defra/forms-model' import Boom from '@hapi/boom' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { getJson } from '~/src/server/services/httpService.js' -const logger = createLogger() - /** * Returns an empty result set */ diff --git a/src/server/plugins/nunjucks/context.js b/src/server/plugins/nunjucks/context.js index 9634e6720..79a01f677 100644 --- a/src/server/plugins/nunjucks/context.js +++ b/src/server/plugins/nunjucks/context.js @@ -5,14 +5,12 @@ import Boom from '@hapi/boom' import { StatusCodes } from 'http-status-codes' import { config } from '~/src/config/index.js' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { checkFormStatus, encodeUrl } from '~/src/server/plugins/engine/helpers.js' -const logger = createLogger() - /** @type {Record | undefined} */ let webpackManifest diff --git a/src/server/plugins/payment/service.js b/src/server/plugins/payment/service.js index 32ae24c8b..5eb72a5a8 100644 --- a/src/server/plugins/payment/service.js +++ b/src/server/plugins/payment/service.js @@ -1,6 +1,6 @@ import { StatusCodes } from 'http-status-codes' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { buildPaymentInfo, convertPenceToPounds @@ -10,8 +10,6 @@ import { get, post, postJson } from '~/src/server/services/httpService.js' const PAYMENT_BASE_URL = 'https://publicapi.payments.service.gov.uk' const PAYMENT_ENDPOINT = '/v1/payments' -const logger = createLogger() - /** * @param {string} apiKey * @returns {{ Authorization: string }} diff --git a/src/server/plugins/postcode-lookup/service.js b/src/server/plugins/postcode-lookup/service.js index bd74f202e..abf37bd8f 100644 --- a/src/server/plugins/postcode-lookup/service.js +++ b/src/server/plugins/postcode-lookup/service.js @@ -1,11 +1,9 @@ import { getErrorMessage } from '@defra/forms-model' import Boom from '@hapi/boom' -import { createLogger } from '~/src/server/common/helpers/logging/logger.js' +import { logger } from '~/src/server/common/helpers/logging/logger.js' import { getJson } from '~/src/server/services/httpService.js' -const logger = createLogger() - /** * Returns an empty result set */