Server/NodeJS & NestJS

NestJS Morgan logger 사용하기

Juzdalua 2022. 3. 11. 16:10

https://docs.nestjs.com/middleware

NestJS 공식 Docs를 확인하면 Middleware를 Logger형식으로 설명해놓았다.

이를 참고해서 Middleware를 공부하기 참 좋았다.

 

Class형 Middleware와 Functional Middleware를 모두 구현했고,

종속성이 필요 없다면 기능적 미들웨어 대안을 사용하는게 좋다고 한다.

 

 

- Class형 사용 방법

// app.modules.ts

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './utils/logger.middleware';

...

export class AppModule implements NestModule{
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMiddleware)  // multiple middleware ex) apply(cors(), helmet(), logger)
      .forRoutes('DiscordController') // global: '*', /cats: 'cats'
  }

 

- 함수형 사용 방법

// main.ts

import { logger } from './utils/logger.middleware';

app.use(logger);

함수형이 훨씬 간단하고 사용 방법도 express와 동일하다.

 

 

이제 log 출력을 위해 nest-morgan을 설치하자.

https://www.npmjs.com/package/nest-morgan

npm usage를 따라하면 된다.

근데 출력되는 콘솔이 쌩 콘솔이라 가독성이 별로고 예쁘지 않다.

그래서 logger middleware를 morgan과 동일하게 수정했다.

 

// logger.middleware.ts

import { Injectable, Logger, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";

//class
@Injectable()
export class LoggerMiddleware implements NestMiddleware{
    private logger = new Logger('HTTP');
    use(req: Request, res: Response, next: NextFunction){
        const { ip, method, originalUrl } = req;
        const userAgent = req.get('user-agent') || '';

        res.on('finish', () => {
        const { statusCode } = res;
        const contentLength = res.get('content-length');

        this.logger.log(
            `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
            );
        });
        next();
    }
}

//functional middleware -> 종속성이 필요 없을 경우 기능적 미들웨어 대안을 사용하는게 좋음.
//useage: main.ts -> app.use(logger) / app.modules.ts -> apply(logger)
export function logger(req: Request, res: Response, next: NextFunction) {
    const logger = new Logger('HTTP');
    const { ip, method, originalUrl } = req;
    const origin = req.get('origin');
    const userAgent = req.get('user-agent') || '';

    res.on('finish', () => {
    const { statusCode } = res;
    const contentLength = res.get('content-length');

    logger.log(
        // `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
        `${method} ${originalUrl} ${statusCode} - ${origin} ${userAgent} ${ip}`,
        );
    });
  next();
};

이렇게 수정하고 나는 함수형 로거를 사용중이다.

Vladimir Agaev님의 도움을 받았다.

출처: https://javascript.plainenglish.io/how-to-use-nestjs-logger-2a9cb107bce9