chore(server): setup winston logger (#9561)

There is no impact on the existing logger, as the current logger is used with `new Logger(Context)` and does not utilize dependency injection. In the next phase, gradually replace and supplement the existing `Logger`.
This commit is contained in:
Brooooooklyn
2025-01-07 09:15:07 +00:00
parent 5e51018c03
commit 482b534a90
10 changed files with 518 additions and 16 deletions

View File

@@ -18,6 +18,7 @@ export { EventEmitter, type EventPayload, OnEvent } from './event';
export type { GraphqlContext } from './graphql';
export * from './guard';
export { CryptoHelper, URLHelper } from './helpers';
export { AFFiNELogger } from './logger';
export { MailService } from './mailer';
export { CallMetric, metrics } from './metrics';
export { Lock, Locker, Mutex, RequestMutex } from './mutex';

View File

@@ -0,0 +1,14 @@
import { Global, Module } from '@nestjs/common';
import { ConfigModule } from '../config';
import { loggerProvider } from './service';
@Global()
@Module({
imports: [ConfigModule],
providers: [loggerProvider],
exports: [loggerProvider],
})
export class LoggerModule {}
export { AFFiNELogger } from './logger';

View File

@@ -0,0 +1,17 @@
import { WinstonLogger } from 'nest-winston';
export class AFFiNELogger extends WinstonLogger {
override error(
message: any,
trace?: Error | string | unknown,
context?: string
) {
if (trace && trace instanceof Error) {
super.error(message, trace.stack, context);
} else if (typeof trace === 'string' || trace === undefined) {
super.error(message, trace, context);
} else {
super.error(message, undefined, context);
}
}
}

View File

@@ -0,0 +1,30 @@
import { LoggingWinston } from '@google-cloud/logging-winston';
import { ConsoleLogger, LoggerService, Provider, Scope } from '@nestjs/common';
import { createLogger, transports } from 'winston';
import { Config } from '../config';
import { AFFiNELogger } from './logger';
export const loggerProvider: Provider<LoggerService> = {
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
scope: Scope.TRANSIENT,
};