Skip to content

Commit 6703cf8

Browse files
authored
Merge pull request #93 from monstar-lab-oss/sivan/logger-service-final
feat: logger service funtions
2 parents 5f6de23 + 7b8f88b commit 6703cf8

18 files changed

+74
-89
lines changed

src/app.controller.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { RequestContext } from './shared/request-context/request-context.dto';
66

77
describe('AppController', () => {
88
let moduleRef: TestingModule;
9-
const mockedLogger = { setContext: jest.fn(), logWithContext: jest.fn() };
9+
const mockedLogger = { setContext: jest.fn(), log: jest.fn() };
1010

1111
beforeEach(async () => {
1212
moduleRef = await Test.createTestingModule({

src/app.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class AppController {
1515

1616
@Get()
1717
getHello(@ReqContext() ctx: RequestContext): string {
18-
this.logger.logWithContext(ctx, 'Hello world from App controller');
18+
this.logger.log(ctx, 'Hello world from App controller');
1919

2020
return this.appService.getHello(ctx);
2121
}

src/app.service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class AppService {
99
}
1010

1111
getHello(ctx: RequestContext): string {
12-
this.logger.logWithContext(ctx, 'Hello world from App service');
12+
this.logger.log(ctx, 'Hello world from App service');
1313

1414
return 'Hello World!';
1515
}

src/auth/controllers/auth.controller.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('AuthController', () => {
1919
refreshToken: jest.fn(),
2020
};
2121

22-
const mockedLogger = { setContext: jest.fn(), logWithContext: jest.fn() };
22+
const mockedLogger = { setContext: jest.fn(), log: jest.fn() };
2323

2424
beforeEach(async () => {
2525
moduleRef = await Test.createTestingModule({

src/auth/controllers/auth.controller.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class AuthController {
5656
// eslint-disable-next-line @typescript-eslint/no-unused-vars
5757
@Body() credential: LoginInput,
5858
): BaseApiResponse<AuthTokenOutput> {
59-
this.logger.logWithContext(ctx, `${this.login.name} was called`);
59+
this.logger.log(ctx, `${this.login.name} was called`);
6060

6161
const authToken = this.authService.login(ctx);
6262
return { data: authToken, meta: {} };
@@ -98,7 +98,7 @@ export class AuthController {
9898
// eslint-disable-next-line @typescript-eslint/no-unused-vars
9999
@Body() credential: RefreshTokenInput,
100100
): Promise<BaseApiResponse<AuthTokenOutput>> {
101-
this.logger.logWithContext(ctx, `${this.refreshToken.name} was called`);
101+
this.logger.log(ctx, `${this.refreshToken.name} was called`);
102102

103103
const authToken = await this.authService.refreshToken(ctx);
104104
return { data: authToken, meta: {} };

src/auth/services/auth.service.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('AuthService', () => {
6363

6464
const mockedConfigService = { get: jest.fn() };
6565

66-
const mockedLogger = { setContext: jest.fn(), logWithContext: jest.fn() };
66+
const mockedLogger = { setContext: jest.fn(), log: jest.fn() };
6767

6868
beforeEach(async () => {
6969
const moduleRef: TestingModule = await Test.createTestingModule({

src/auth/services/auth.service.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class AuthService {
3131
username: string,
3232
pass: string,
3333
): Promise<UserAccessTokenClaims> {
34-
this.logger.logWithContext(ctx, `${this.validateUser.name} was called`);
34+
this.logger.log(ctx, `${this.validateUser.name} was called`);
3535

3636
// The userService will throw Unauthorized in case of invalid username/password.
3737
const user = await this.userService.validateUsernamePassword(
@@ -49,7 +49,7 @@ export class AuthService {
4949
}
5050

5151
login(ctx: RequestContext): AuthTokenOutput {
52-
this.logger.logWithContext(ctx, `${this.login.name} was called`);
52+
this.logger.log(ctx, `${this.login.name} was called`);
5353

5454
return this.getAuthToken(ctx, ctx.user);
5555
}
@@ -58,7 +58,7 @@ export class AuthService {
5858
ctx: RequestContext,
5959
input: RegisterInput,
6060
): Promise<RegisterOutput> {
61-
this.logger.logWithContext(ctx, `${this.register.name} was called`);
61+
this.logger.log(ctx, `${this.register.name} was called`);
6262

6363
// TODO : Setting default role as USER here. Will add option to change this later via ADMIN users.
6464
input.roles = [ROLE.USER];
@@ -71,7 +71,7 @@ export class AuthService {
7171
}
7272

7373
async refreshToken(ctx: RequestContext): Promise<AuthTokenOutput> {
74-
this.logger.logWithContext(ctx, `${this.refreshToken.name} was called`);
74+
this.logger.log(ctx, `${this.refreshToken.name} was called`);
7575

7676
const user = await this.userService.findById(ctx, ctx.user.id);
7777
if (!user) {
@@ -85,7 +85,7 @@ export class AuthService {
8585
ctx: RequestContext,
8686
user: UserAccessTokenClaims | UserOutput,
8787
): AuthTokenOutput {
88-
this.logger.logWithContext(ctx, `${this.getAuthToken.name} was called`);
88+
this.logger.log(ctx, `${this.getAuthToken.name} was called`);
8989

9090
const subject = { sub: user.id };
9191
const payload = {

src/auth/strategies/local.strategy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class LocalStrategy extends PassportStrategy(Strategy, STRATEGY_LOCAL) {
3131
): Promise<UserAccessTokenClaims> {
3232
const ctx = createRequestContext(request);
3333

34-
this.logger.logWithContext(ctx, `${this.validate.name} was called`);
34+
this.logger.log(ctx, `${this.validate.name} was called`);
3535

3636
const user = await this.authService.validateUser(ctx, username, password);
3737
// Passport automatically creates a user object, based on the value we return from the validate() method,

src/cli.ts

-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { ConfigService } from '@nestjs/config';
33

44
import { AppModule } from './app.module';
55

6-
import { AppLogger } from './shared/logger/logger.service';
76
import { UserService } from './user/services/user.service';
87
import { ROLE } from './auth/constants/role.constant';
98
import { CreateUserInput } from './user/dtos/user-create-input.dto';
@@ -12,8 +11,6 @@ import { RequestContext } from './shared/request-context/request-context.dto';
1211
async function bootstrap() {
1312
const app = await NestFactory.createApplicationContext(AppModule);
1413

15-
app.useLogger(new AppLogger());
16-
1714
const configService = app.get(ConfigService);
1815
const defaultAdminUserPassword = configService.get<string>(
1916
'defaultAdminUserPassword',

src/main.ts

-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@ import { ValidationPipe } from '@nestjs/common';
44
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
55

66
import { AppModule } from './app.module';
7-
import { AppLogger } from './shared/logger/logger.service';
87
import { RequestIdMiddleware } from './shared/middlewares/request-id/request-id.middleware';
98

109
async function bootstrap() {
1110
const app = await NestFactory.create(AppModule);
1211
app.setGlobalPrefix('api/v1');
1312

14-
app.useLogger(new AppLogger());
1513
app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }));
1614
app.use(RequestIdMiddleware);
1715
app.enableCors();

src/shared/filters/all-exceptions.filter.spec.ts

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ describe('AllExceptionsFilter', () => {
2525
const mockedLogger = {
2626
warn: jest.fn().mockReturnThis(),
2727
setContext: jest.fn().mockReturnThis(),
28-
warnWithContext: jest.fn().mockReturnThis(),
2928
};
3029
let filter: AllExceptionsFilter<any>;
3130

src/shared/filters/all-exceptions.filter.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export class AllExceptionsFilter<T> implements ExceptionFilter {
7777
requestId,
7878
timestamp,
7979
};
80-
this.logger.warnWithContext(requestContext, error.message, {
80+
this.logger.warn(requestContext, error.message, {
8181
error,
8282
stack,
8383
});

src/shared/interceptors/logging.interceptor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class LoggingInterceptor implements NestInterceptor {
3030

3131
const resData = { method, statusCode, responseTime };
3232

33-
this.appLogger.logWithContext(ctx, 'Request completed', { resData });
33+
this.appLogger.log(ctx, 'Request completed', { resData });
3434
}),
3535
);
3636
}

src/shared/logger/logger.service.ts

+38-41
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { Injectable, LoggerService, Scope } from '@nestjs/common';
1+
import { Injectable, Scope } from '@nestjs/common';
22
import { createLogger, Logger, transports } from 'winston';
33
import { RequestContext } from '../request-context/request-context.dto';
44

55
@Injectable({ scope: Scope.TRANSIENT })
6-
export class AppLogger implements LoggerService {
6+
export class AppLogger {
77
private context?: string;
88
private logger: Logger;
99

@@ -17,53 +17,49 @@ export class AppLogger implements LoggerService {
1717
});
1818
}
1919

20-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
21-
log(message: any, context?: string): Logger {
22-
return this.logger.info(message, {
23-
context: context || this.context,
24-
});
25-
}
26-
27-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
28-
error(message: any, trace?: string, context?: string): Logger {
29-
return this.logger.error(message, {
30-
trace,
31-
context: context || this.context,
32-
});
33-
}
20+
error(
21+
ctx: RequestContext,
22+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
23+
message: string,
24+
meta?: Record<string, any>,
25+
): Logger {
26+
const timestamp = new Date().toISOString();
3427

35-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
36-
warn(message: any, context?: string): Logger {
37-
return this.logger.warn(message, {
38-
context: context || this.context,
28+
return this.logger.error({
29+
message,
30+
contextName: this.context,
31+
ctx,
32+
timestamp,
33+
...meta,
3934
});
4035
}
4136

42-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
43-
debug(message: any, context?: string): Logger {
44-
return this.logger.debug(message, {
45-
context: context || this.context,
46-
});
47-
}
37+
warn(
38+
ctx: RequestContext,
39+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
40+
message: string,
41+
meta?: Record<string, any>,
42+
): Logger {
43+
const timestamp = new Date().toISOString();
4844

49-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
50-
verbose(message: any, context?: string): Logger {
51-
return this.logger.verbose(message, {
52-
context: context || this.context,
45+
return this.logger.warn({
46+
message,
47+
contextName: this.context,
48+
ctx,
49+
timestamp,
50+
...meta,
5351
});
5452
}
5553

56-
// TODO : This is a temporary function, it will be renamed to `log` once we update it across
57-
// all controllers, services, etc.
58-
logWithContext(
54+
debug(
5955
ctx: RequestContext,
6056
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
61-
message: any,
57+
message: string,
6258
meta?: Record<string, any>,
6359
): Logger {
6460
const timestamp = new Date().toISOString();
6561

66-
return this.logger.info({
62+
return this.logger.debug({
6763
message,
6864
contextName: this.context,
6965
ctx,
@@ -72,15 +68,16 @@ export class AppLogger implements LoggerService {
7268
});
7369
}
7470

75-
warnWithContext(
71+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
72+
verbose(
7673
ctx: RequestContext,
7774
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
78-
message: any,
75+
message: string,
7976
meta?: Record<string, any>,
8077
): Logger {
8178
const timestamp = new Date().toISOString();
8279

83-
return this.logger.warn({
80+
return this.logger.verbose({
8481
message,
8582
contextName: this.context,
8683
ctx,
@@ -89,15 +86,15 @@ export class AppLogger implements LoggerService {
8986
});
9087
}
9188

92-
errorWithContext(
89+
log(
9390
ctx: RequestContext,
9491
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
95-
message: any,
92+
message: string,
9693
meta?: Record<string, any>,
9794
): Logger {
9895
const timestamp = new Date().toISOString();
9996

100-
return this.logger.error({
97+
return this.logger.info({
10198
message,
10299
contextName: this.context,
103100
ctx,

src/user/controllers/user.controller.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('UserController', () => {
1919
updateUser: jest.fn(),
2020
};
2121

22-
const mockedLogger = { setContext: jest.fn(), logWithContext: jest.fn() };
22+
const mockedLogger = { setContext: jest.fn(), log: jest.fn() };
2323

2424
beforeEach(async () => {
2525
const moduleRef: TestingModule = await Test.createTestingModule({

src/user/controllers/user.controller.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class UserController {
5656
async getMyProfile(
5757
@ReqContext() ctx: RequestContext,
5858
): Promise<BaseApiResponse<UserOutput>> {
59-
this.logger.logWithContext(ctx, `${this.getMyProfile.name} was called`);
59+
this.logger.log(ctx, `${this.getMyProfile.name} was called`);
6060

6161
const user = await this.userService.findById(ctx, ctx.user.id);
6262
return { data: user, meta: {} };
@@ -81,7 +81,7 @@ export class UserController {
8181
@ReqContext() ctx: RequestContext,
8282
@Query() query: PaginationParamsDto,
8383
): Promise<BaseApiResponse<UserOutput[]>> {
84-
this.logger.logWithContext(ctx, `${this.getUsers.name} was called`);
84+
this.logger.log(ctx, `${this.getUsers.name} was called`);
8585

8686
const { users, count } = await this.userService.getUsers(
8787
ctx,
@@ -111,7 +111,7 @@ export class UserController {
111111
@ReqContext() ctx: RequestContext,
112112
@Param('id') id: number,
113113
): Promise<BaseApiResponse<UserOutput>> {
114-
this.logger.logWithContext(ctx, `${this.getUser.name} was called`);
114+
this.logger.log(ctx, `${this.getUser.name} was called`);
115115

116116
const user = await this.userService.getUserById(ctx, id);
117117
return { data: user, meta: {} };
@@ -137,7 +137,7 @@ export class UserController {
137137
@Param('id') userId: number,
138138
@Body() input: UpdateUserInput,
139139
): Promise<BaseApiResponse<UserOutput>> {
140-
this.logger.logWithContext(ctx, `${this.updateUser.name} was called`);
140+
this.logger.log(ctx, `${this.updateUser.name} was called`);
141141

142142
const user = await this.userService.updateUser(ctx, userId, input);
143143
return { data: user, meta: {} };

src/user/services/user.service.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ describe('UserService', () => {
2828
roles: [ROLE.USER],
2929
};
3030

31-
const mockedLogger = { setContext: jest.fn(), logWithContext: jest.fn() };
31+
const mockedLogger = { setContext: jest.fn(), log: jest.fn() };
3232

3333
beforeEach(async () => {
3434
const moduleRef: TestingModule = await Test.createTestingModule({

0 commit comments

Comments
 (0)