From fd26b7225543c3b7843c5e4cfd34ef26a98f383f Mon Sep 17 00:00:00 2001 From: Brooooooklyn Date: Wed, 8 Jan 2025 14:47:42 +0000 Subject: [PATCH] fix(server): disable winston in seflhost instance (#9585) --- .../backend/server/src/base/logger/index.ts | 8 ++--- .../backend/server/src/base/logger/service.ts | 32 +++---------------- .../backend/server/src/base/mailer/mailer.ts | 9 +++--- .../server/src/plugins/gcloud/index.ts | 3 +- .../src/plugins/gcloud/logging/index.ts | 13 ++++++++ .../gcloud/logging}/logger.ts | 0 .../src/plugins/gcloud/logging/service.ts | 26 +++++++++++++++ 7 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 packages/backend/server/src/plugins/gcloud/logging/index.ts rename packages/backend/server/src/{base/logger => plugins/gcloud/logging}/logger.ts (100%) create mode 100644 packages/backend/server/src/plugins/gcloud/logging/service.ts diff --git a/packages/backend/server/src/base/logger/index.ts b/packages/backend/server/src/base/logger/index.ts index 433821f38f..6cda0fce5e 100644 --- a/packages/backend/server/src/base/logger/index.ts +++ b/packages/backend/server/src/base/logger/index.ts @@ -1,14 +1,14 @@ import { Global, Module } from '@nestjs/common'; import { ConfigModule } from '../config'; -import { loggerProvider } from './service'; +import { AFFiNELogger } from './service'; @Global() @Module({ imports: [ConfigModule], - providers: [loggerProvider], - exports: [loggerProvider], + providers: [AFFiNELogger], + exports: [AFFiNELogger], }) export class LoggerModule {} -export { AFFiNELogger } from './logger'; +export { AFFiNELogger } from './service'; diff --git a/packages/backend/server/src/base/logger/service.ts b/packages/backend/server/src/base/logger/service.ts index 3cb9831db8..8b9b958756 100644 --- a/packages/backend/server/src/base/logger/service.ts +++ b/packages/backend/server/src/base/logger/service.ts @@ -1,30 +1,6 @@ -import { LoggingWinston } from '@google-cloud/logging-winston'; -import { ConsoleLogger, LoggerService, Provider, Scope } from '@nestjs/common'; -import { createLogger, transports } from 'winston'; +import { ConsoleLogger, Injectable, Scope } from '@nestjs/common'; -import { Config } from '../config'; -import { AFFiNELogger } from './logger'; - -export const loggerProvider: Provider = { - provide: AFFiNELogger, - useFactory: (config: Config) => { - if (config.NODE_ENV !== 'production') { - return new ConsoleLogger(); - } - const loggingWinston = new LoggingWinston(); - // Create a Winston logger that streams to Cloud Logging - const instance = createLogger({ - level: config.affine.stable ? 'log' : 'verbose', - transports: [ - new transports.Console(), - // Add Cloud Logging - loggingWinston, - ], - }); - return new AFFiNELogger(instance); - }, - inject: [Config], - // use transient to make sure the logger is created for each di context - // to make the `setContext` method works as expected +@Injectable({ scope: Scope.TRANSIENT, -}; +}) +export class AFFiNELogger extends ConsoleLogger {} diff --git a/packages/backend/server/src/base/mailer/mailer.ts b/packages/backend/server/src/base/mailer/mailer.ts index eed4a4f4d9..b07f822a7e 100644 --- a/packages/backend/server/src/base/mailer/mailer.ts +++ b/packages/backend/server/src/base/mailer/mailer.ts @@ -1,8 +1,9 @@ -import { FactoryProvider, Logger } from '@nestjs/common'; +import { FactoryProvider } from '@nestjs/common'; import { createTransport, Transporter } from 'nodemailer'; import SMTPTransport from 'nodemailer/lib/smtp-transport'; import { Config } from '../config'; +import { AFFiNELogger } from '../logger'; export const MAILER_SERVICE = Symbol('MAILER_SERVICE'); @@ -14,9 +15,9 @@ export const MAILER: FactoryProvider< Transporter | undefined > = { provide: MAILER_SERVICE, - useFactory: (config: Config) => { + useFactory: (config: Config, logger: AFFiNELogger) => { if (config.mailer) { - const logger = new Logger('Mailer'); + logger.setContext('Mailer'); const auth = config.mailer.auth; if (auth && auth.user && !('pass' in auth)) { logger.warn( @@ -29,5 +30,5 @@ export const MAILER: FactoryProvider< return undefined; } }, - inject: [Config], + inject: [Config, AFFiNELogger], }; diff --git a/packages/backend/server/src/plugins/gcloud/index.ts b/packages/backend/server/src/plugins/gcloud/index.ts index d82ac08ff5..f2fbfe1a27 100644 --- a/packages/backend/server/src/plugins/gcloud/index.ts +++ b/packages/backend/server/src/plugins/gcloud/index.ts @@ -3,11 +3,12 @@ import './config'; import { Global } from '@nestjs/common'; import { Plugin } from '../registry'; +import { GCloudLogging } from './logging'; import { GCloudMetrics } from './metrics'; @Global() @Plugin({ name: 'gcloud', - imports: [GCloudMetrics], + imports: [GCloudMetrics, GCloudLogging], }) export class GCloudModule {} diff --git a/packages/backend/server/src/plugins/gcloud/logging/index.ts b/packages/backend/server/src/plugins/gcloud/logging/index.ts new file mode 100644 index 0000000000..0109ee5ccf --- /dev/null +++ b/packages/backend/server/src/plugins/gcloud/logging/index.ts @@ -0,0 +1,13 @@ +import { Global } from '@nestjs/common'; + +import { OptionalModule } from '../../../base'; +import { loggerProvider } from './service'; + +@Global() +@OptionalModule({ + if: config => config.metrics.enabled, + overrides: [loggerProvider], +}) +export class GCloudLogging {} + +export { AFFiNELogger } from './logger'; diff --git a/packages/backend/server/src/base/logger/logger.ts b/packages/backend/server/src/plugins/gcloud/logging/logger.ts similarity index 100% rename from packages/backend/server/src/base/logger/logger.ts rename to packages/backend/server/src/plugins/gcloud/logging/logger.ts diff --git a/packages/backend/server/src/plugins/gcloud/logging/service.ts b/packages/backend/server/src/plugins/gcloud/logging/service.ts new file mode 100644 index 0000000000..bb0e44cf4d --- /dev/null +++ b/packages/backend/server/src/plugins/gcloud/logging/service.ts @@ -0,0 +1,26 @@ +import { LoggingWinston } from '@google-cloud/logging-winston'; +import { LoggerService, Provider, Scope } from '@nestjs/common'; +import { createLogger, transports } from 'winston'; + +import { AFFiNELogger as LoggerProvide } from '../../../base/logger'; +import { AFFiNELogger } from './logger'; + +export const loggerProvider: Provider = { + provide: LoggerProvide, + useFactory: () => { + const loggingWinston = new LoggingWinston(); + // Create a Winston logger that streams to Cloud Logging + const instance = createLogger({ + level: 'log', + transports: [ + new transports.Console(), + // Add Cloud Logging + loggingWinston, + ], + }); + return new AFFiNELogger(instance); + }, + // use transient to make sure the logger is created for each di context + // to make the `setContext` method works as expected + scope: Scope.TRANSIENT, +};