Skip to content

Commit

Permalink
chore(server): setup winston logger (#9561)
Browse files Browse the repository at this point in the history
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`.
  • Loading branch information
Brooooooklyn committed Jan 7, 2025
1 parent 5e51018 commit 482b534
Show file tree
Hide file tree
Showing 10 changed files with 518 additions and 16 deletions.
3 changes: 3 additions & 0 deletions packages/backend/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"@apollo/server": "^4.11.2",
"@aws-sdk/client-s3": "^3.709.0",
"@fal-ai/serverless-client": "^0.15.0",
"@google-cloud/logging-winston": "^6.0.0",
"@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.20.0",
"@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1",
"@google-cloud/opentelemetry-resource-util": "^2.4.0",
Expand Down Expand Up @@ -73,6 +74,7 @@
"mustache": "^4.2.0",
"nanoid": "^5.0.9",
"nest-commander": "^3.15.0",
"nest-winston": "^1.9.7",
"nestjs-throttler-storage-redis": "^0.5.1",
"nodemailer": "^6.9.16",
"on-headers": "^1.0.2",
Expand All @@ -86,6 +88,7 @@
"stripe": "^17.4.0",
"ts-node": "^10.9.2",
"typescript": "^5.7.2",
"winston": "^3.17.0",
"yjs": "^13.6.21",
"zod": "^3.24.1"
},
Expand Down
2 changes: 2 additions & 0 deletions packages/backend/server/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { ErrorModule } from './base/error';
import { EventModule } from './base/event';
import { GqlModule } from './base/graphql';
import { HelpersModule } from './base/helpers';
import { LoggerModule } from './base/logger';
import { MailModule } from './base/mailer';
import { MetricsModule } from './base/metrics';
import { MutexModule } from './base/mutex';
Expand Down Expand Up @@ -53,6 +54,7 @@ export const FunctionalityModules = [
StorageProviderModule,
HelpersModule,
ErrorModule,
LoggerModule,
];

function filterOptionalModule(
Expand Down
1 change: 0 additions & 1 deletion packages/backend/server/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export async function createApp() {
cors: true,
rawBody: true,
bodyParser: true,
logger: AFFiNE.affine.stable ? ['log'] : ['verbose'],
});

if (AFFiNE.server.path) {
Expand Down
1 change: 1 addition & 0 deletions packages/backend/server/src/base/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
14 changes: 14 additions & 0 deletions packages/backend/server/src/base/logger/index.ts
Original file line number Diff line number Diff line change
@@ -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';
17 changes: 17 additions & 0 deletions packages/backend/server/src/base/logger/logger.ts
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
30 changes: 30 additions & 0 deletions packages/backend/server/src/base/logger/service.ts
Original file line number Diff line number Diff line change
@@ -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,
};
9 changes: 6 additions & 3 deletions packages/backend/server/src/core/doc/job.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Injectable, Logger, OnModuleInit, Optional } from '@nestjs/common';
import { Injectable, OnModuleInit, Optional } from '@nestjs/common';
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
import { PrismaClient } from '@prisma/client';

import {
AFFiNELogger,
CallMetric,
Config,
type EventPayload,
Expand All @@ -13,15 +14,17 @@ import { PgWorkspaceDocStorageAdapter } from './adapters/workspace';

@Injectable()
export class DocStorageCronJob implements OnModuleInit {
private readonly logger = new Logger(DocStorageCronJob.name);
private busy = false;

constructor(
private readonly config: Config,
private readonly db: PrismaClient,
private readonly workspace: PgWorkspaceDocStorageAdapter,
private readonly logger: AFFiNELogger,
@Optional() private readonly registry?: SchedulerRegistry
) {}
) {
this.logger.setContext(DocStorageCronJob.name);
}

onModuleInit() {
if (this.registry && this.config.doc.manager.enableUpdateAutoMerging) {
Expand Down
2 changes: 1 addition & 1 deletion packages/backend/server/src/middleware/timing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const serverTimingAndCache = (
const serverTiming = res.getHeader('Server-Timing') as string | undefined;
const serverTimingValue = `${
serverTiming ? `${serverTiming}, ` : ''
}total;dur=${costInMilliseconds}`;
}affine-server;dur=${costInMilliseconds}`;

res.setHeader('Server-Timing', serverTimingValue);
});
Expand Down
Loading

0 comments on commit 482b534

Please sign in to comment.