Skip to content

Commit 6071ea8

Browse files
feature(common) enhance internal logger
1 parent 53687ba commit 6071ea8

5 files changed

Lines changed: 61 additions & 62 deletions

File tree

packages/common/enums/nest-environment.enum.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

packages/common/services/logger.service.ts

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,50 @@
11
import * as clc from 'cli-color';
22
import { Injectable, Optional } from '../decorators';
3-
import { NestEnvironment } from '../enums/nest-environment.enum';
43
import { isObject } from '../utils/shared.utils';
54

65
declare const process: any;
6+
const yellow = clc.xterm(3);
77

88
export interface LoggerService {
9-
log(message: any, context?: string): any;
10-
error(message: any, trace?: string, context?: string): any;
11-
warn(message: any, context?: string): any;
9+
log(message: any, context?: string);
10+
error(message: any, trace?: string, context?: string);
11+
warn(message: any, context?: string);
1212
}
1313

1414
@Injectable()
1515
export class Logger implements LoggerService {
16-
private static prevTimestamp?: number;
17-
private static contextEnvironment = NestEnvironment.RUN;
18-
private static logger?: typeof Logger | LoggerService = Logger;
19-
private static readonly yellow = clc.xterm(3);
16+
private static lastTimestamp?: number;
17+
private static instance?: typeof Logger | LoggerService = Logger;
2018

2119
constructor(
2220
@Optional() private readonly context?: string,
23-
@Optional() private readonly isTimeDiffEnabled = false,
21+
@Optional() private readonly isTimestampEnabled = false,
2422
) {}
2523

26-
log(message: any, context?: string) {
27-
const { logger } = Logger;
28-
if (logger === this) {
29-
Logger.log(message, context || this.context, this.isTimeDiffEnabled);
30-
return;
31-
}
32-
logger && logger.log.call(logger, message, context || this.context);
24+
error(message: any, trace = '', context?: string) {
25+
const instance = this.getInstance();
26+
instance &&
27+
instance.error.call(instance, message, trace, context || this.context);
3328
}
3429

35-
error(message: any, trace = '', context?: string) {
36-
const { logger } = Logger;
37-
if (logger === this) {
38-
Logger.error(message, trace, context || this.context);
39-
return;
40-
}
41-
logger &&
42-
logger.error.call(logger, message, trace, context || this.context);
30+
log(message: any, context?: string) {
31+
this.callFunction('log', message, context);
4332
}
4433

4534
warn(message: any, context?: string) {
46-
const { logger } = Logger;
47-
if (logger === this) {
48-
Logger.warn(message, context || this.context, this.isTimeDiffEnabled);
49-
return;
50-
}
51-
logger && logger.warn.call(logger, message, context || this.context);
35+
this.callFunction('warn', message, context);
5236
}
5337

54-
static overrideLogger(logger: LoggerService | boolean) {
55-
this.logger = logger ? (logger as LoggerService) : undefined;
38+
debug(message: any, context?: string) {
39+
this.callFunction('debug', message, context);
5640
}
5741

58-
static setMode(mode: NestEnvironment) {
59-
this.contextEnvironment = mode;
42+
verbose(message: any, context?: string) {
43+
this.callFunction('verbose', message, context);
44+
}
45+
46+
static overrideLogger(logger: LoggerService | boolean) {
47+
this.instance = isObject(logger) ? (logger as LoggerService) : undefined;
6048
}
6149

6250
static log(message: any, context = '', isTimeDiffEnabled = true) {
@@ -77,38 +65,65 @@ export class Logger implements LoggerService {
7765
this.printMessage(message, clc.yellow, context, isTimeDiffEnabled);
7866
}
7967

68+
static debug(message: any, context = '', isTimeDiffEnabled = true) {
69+
this.printMessage(message, clc.magentaBright, context, isTimeDiffEnabled);
70+
}
71+
72+
static verbose(message: any, context = '', isTimeDiffEnabled = true) {
73+
this.printMessage(message, clc.cyanBright, context, isTimeDiffEnabled);
74+
}
75+
76+
private callFunction(
77+
name: 'log' | 'warn' | 'debug' | 'verbose',
78+
message: any,
79+
context?: string,
80+
) {
81+
const instance = this.getInstance();
82+
const func = instance && (instance as typeof Logger)[name];
83+
func &&
84+
func.call(
85+
instance,
86+
message,
87+
context || this.context,
88+
this.isTimestampEnabled,
89+
);
90+
}
91+
92+
private getInstance(): typeof Logger | LoggerService {
93+
const { instance } = Logger;
94+
return instance === this ? Logger : instance;
95+
}
96+
8097
private static printMessage(
8198
message: any,
8299
color: (message: string) => string,
83100
context: string = '',
84101
isTimeDiffEnabled?: boolean,
85102
) {
86-
if (Logger.contextEnvironment === NestEnvironment.TEST) {
87-
return;
88-
}
89-
const output = isObject(message) ? JSON.stringify(message, null, 2) : message;
103+
const output = isObject(message)
104+
? `${color('Object:')}\n${JSON.stringify(message, null, 2)}\n`
105+
: color(message);
106+
90107
process.stdout.write(color(`[Nest] ${process.pid} - `));
91108
process.stdout.write(`${new Date(Date.now()).toLocaleString()} `);
92109

93-
context && process.stdout.write(this.yellow(`[${context}] `));
94-
process.stdout.write(color(output));
110+
context && process.stdout.write(yellow(`[${context}] `));
111+
process.stdout.write(output);
95112

96113
this.printTimestamp(isTimeDiffEnabled);
97114
process.stdout.write(`\n`);
98115
}
99116

100117
private static printTimestamp(isTimeDiffEnabled?: boolean) {
101-
const includeTimestamp = Logger.prevTimestamp && isTimeDiffEnabled;
118+
const includeTimestamp = Logger.lastTimestamp && isTimeDiffEnabled;
102119
if (includeTimestamp) {
103-
process.stdout.write(
104-
this.yellow(` +${Date.now() - Logger.prevTimestamp}ms`),
105-
);
120+
process.stdout.write(yellow(` +${Date.now() - Logger.lastTimestamp}ms`));
106121
}
107-
Logger.prevTimestamp = Date.now();
122+
Logger.lastTimestamp = Date.now();
108123
}
109124

110125
private static printStackTrace(trace: string) {
111-
if (this.contextEnvironment === NestEnvironment.TEST || !trace) {
126+
if (!trace) {
112127
return;
113128
}
114129
process.stdout.write(trace);

packages/core/test/exceptions/exceptions-handler.spec.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { HttpException } from '@nestjs/common';
22
import { isNil, isObject } from '@nestjs/common/utils/shared.utils';
33
import { expect } from 'chai';
44
import * as sinon from 'sinon';
5-
import { NestEnvironment } from '../../../common/enums/nest-environment.enum';
6-
import { Logger } from '../../../common/services/logger.service';
75
import { AbstractHttpAdapter } from '../../adapters';
86
import { InvalidExceptionFilterException } from '../../errors/exceptions/invalid-exception-filter.exception';
97
import { ExceptionsHandler } from '../../exceptions/exceptions-handler';
@@ -17,8 +15,6 @@ describe('ExceptionsHandler', () => {
1715
let jsonStub: sinon.SinonStub;
1816
let response;
1917

20-
before(() => Logger.setMode(NestEnvironment.TEST));
21-
2218
beforeEach(() => {
2319
adapter = new NoopHttpAdapter({});
2420
handler = new ExceptionsHandler(adapter);

packages/core/test/injector/instance-loader.spec.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { expect } from 'chai';
22
import * as sinon from 'sinon';
33
import { Injectable } from '../../../common';
44
import { Controller } from '../../../common/decorators/core/controller.decorator';
5-
import { NestEnvironment } from '../../../common/enums/nest-environment.enum';
6-
import { Logger } from '../../../common/services/logger.service';
75
import { NestContainer } from '../../injector/container';
86
import { Injector } from '../../injector/injector';
97
import { InstanceLoader } from '../../injector/instance-loader';
@@ -19,8 +17,6 @@ describe('InstanceLoader', () => {
1917
@Injectable()
2018
class TestProvider {}
2119

22-
before(() => Logger.setMode(NestEnvironment.TEST));
23-
2420
beforeEach(() => {
2521
container = new NestContainer();
2622
loader = new InstanceLoader(container);

packages/core/test/middleware/resolver.spec.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { expect } from 'chai';
22
import * as sinon from 'sinon';
33
import { Injectable } from '../../../common';
4-
import { NestEnvironment } from '../../../common/enums/nest-environment.enum';
54
import { NestMiddleware } from '../../../common/interfaces/middleware/nest-middleware.interface';
6-
import { Logger } from '../../../common/services/logger.service';
75
import { MiddlewareContainer } from '../../middleware/container';
86
import { MiddlewareResolver } from '../../middleware/resolver';
97

@@ -19,8 +17,6 @@ describe('MiddlewareResolver', () => {
1917
let container: MiddlewareContainer;
2018
let mockContainer: sinon.SinonMock;
2119

22-
before(() => Logger.setMode(NestEnvironment.TEST));
23-
2420
beforeEach(() => {
2521
container = new MiddlewareContainer();
2622
resolver = new MiddlewareResolver(container);

0 commit comments

Comments
 (0)