Skip to content

Commit e153312

Browse files
committed
added loader
1 parent 56591af commit e153312

5 files changed

Lines changed: 170 additions & 2 deletions

File tree

package-lock.json

Lines changed: 92 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@
2525
"@nestjs/core": "^11.0.1",
2626
"@nestjs/mongoose": "^11.0.3",
2727
"@nestjs/platform-express": "^11.0.1",
28+
"@nestjs/swagger": "^11.1.5",
2829
"@types/joi": "^17.2.2",
2930
"dotenv": "^16.5.0",
3031
"joi": "^17.13.3",
3132
"mongoose": "^8.13.2",
3233
"reflect-metadata": "^0.2.2",
3334
"rxjs": "^7.8.1",
35+
"swagger-ui-express": "^5.0.1",
3436
"winston": "^3.17.0",
3537
"winston-daily-rotate-file": "^5.0.0"
3638
},
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {
2+
ExceptionFilter,
3+
Catch,
4+
ArgumentsHost,
5+
HttpException,
6+
} from '@nestjs/common';
7+
import { Request, Response } from 'express';
8+
import { LoggerService } from '../logger/services/logger.service';
9+
10+
@Catch()
11+
export class AllExceptionsFilter implements ExceptionFilter {
12+
constructor(private readonly logger: LoggerService) {}
13+
14+
catch(exception: unknown, host: ArgumentsHost) {
15+
const ctx = host.switchToHttp();
16+
const response = ctx.getResponse<Response>();
17+
const request = ctx.getRequest<Request>();
18+
const status =
19+
exception instanceof HttpException ? exception.getStatus() : 500;
20+
21+
const message =
22+
exception instanceof Error ? exception.message : 'Internal server error';
23+
const stack = exception instanceof Error ? exception.stack : undefined;
24+
25+
this.logger.error(`[${request.method}] ${request.url} - ${message}`, stack);
26+
27+
response.status(status).json({
28+
statusCode: status,
29+
timestamp: new Date().toISOString(),
30+
path: request.url,
31+
message,
32+
});
33+
}
34+
}

src/logger/logger.module.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Module } from '@nestjs/common';
2+
import { LoggerService } from './services/logger.service';
3+
4+
@Module({
5+
providers: [LoggerService],
6+
exports: [LoggerService],
7+
})
8+
export class LoggerModule {}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Injectable } from '@nestjs/common';
2+
import * as winston from 'winston';
3+
import 'winston-daily-rotate-file';
4+
5+
@Injectable()
6+
export class LoggerService {
7+
private readonly logger: winston.Logger;
8+
9+
constructor() {
10+
this.logger = winston.createLogger({
11+
level: 'info',
12+
format: winston.format.combine(
13+
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
14+
winston.format.json(),
15+
),
16+
transports: [
17+
new winston.transports.DailyRotateFile({
18+
filename: 'logs/app-%DATE%.log',
19+
datePattern: 'YYYY-MM-DD',
20+
zippedArchive: true,
21+
maxFiles: '14d',
22+
}),
23+
],
24+
});
25+
}
26+
27+
log(message: string) {
28+
this.logger.info(message);
29+
}
30+
31+
error(message: string, trace?: string) {
32+
this.logger.error({ message, trace });
33+
}
34+
}

0 commit comments

Comments
 (0)