I made model in folder modules/logger
.
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { WinstonModule } from 'nest-winston';
import { winstonConfig } from './winston.config';
import { LoggerInterceptor } from './interceptor/logger.interceptor';
@Module({
imports: [WinstonModule.forRoot(winstonConfig)],
controllers: [],
providers: [
{
provide: APP_INTERCEPTOR,
useClass: LoggerInterceptor,
},
],
})
export class LoggerModule {}
My config file of logger in folder modules/logger
.
import { utilities, WinstonModuleOptions } from 'nest-winston';
import { config, format, transports } from 'winston';
export const winstonConfig: WinstonModuleOptions = {
levels: config.npm.levels,
level: 'verbose',
transports: [
new transports.Console({
format: format.combine(format.timestamp(), utilities.format.nestLike()),
}),
new transports.File({
level: 'verbose',
filename: 'application.log',
dirname: 'logs',
maxsize: 104857600, // 100MB
}),
],
};
After a mode an interceptor in folder modules/logger/interceptor
.
import { Injectable, Inject, NestInterceptor, CallHandler, ExecutionContext } from '@nestjs/common';
import { Logger } from 'winston';
import { Observable } from 'rxjs';
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
@Injectable()
export class LoggerInterceptor implements NestInterceptor {
constructor(@Inject(WINSTON_MODULE_PROVIDER) private logger: Logger) {}
public intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
this.log(context.switchToHttp().getRequest());
return next.handle();
}
private log(req): void {
const body = { ...req.body };
delete body.password;
delete body.passwordConfirmation;
const user = (req as any).user;
const userEmail = user ? user.email : null;
const data = {
timestamp: new Date().toISOString(),
method: req.method,
route: req.route.path,
data: {
body: body,
query: req.query,
params: req.params,
},
from: req.ip,
madeBy: userEmail,
};
console.log(data);
this.logger.info(data);
}
}
In my app.module
I added my logger.module
.
...
import { LoggerModule } from './modules/logger/logger.module';
@Module({
imports: [..., LoggerModule],
controllers: [],
providers: [],
})
export class AppModule {}
Where I run me app I see in console [object Object]
.
...
backend | [NestWinston] Info 9/15/2020, 11:10:24 AM [RouterExplorer] Mapped {/user/update-user, PATCH} route - {}
backend | [NestWinston] Info 9/15/2020, 11:10:24 AM [RouterExplorer] Mapped {/user/delete-user/:id, DELETE} route - {}
backend | [NestWinston] Info 9/15/2020, 11:10:24 AM [RouterExplorer] Mapped {/user/profile, GET} route - {}
backend | [NestWinston] Info 9/15/2020, 11:10:24 AM [RouterExplorer] Mapped {/user/find-users, GET} route - {}
backend | [NestWinston] Info 9/15/2020, 11:10:24 AM [NestApplication] Nest application successfully started - {}
backend | {
backend | timestamp: '2020-09-15T11:12:01.729Z',
backend | method: 'POST',
backend | route: '/auth/sign-in',
backend | data: { body: { email: '[email protected]' }, query: {}, params: {} },
backend | from: '::ffff:172.23.0.1',
backend | madeBy: null
backend | }
backend | [NestWinston] Info 9/15/2020, 11:12:01 AM [object Object] - {}
But usual console.log is show all object.
Why is it work so? Where I make mistake?