loggerMiddleware๋กœ morgan์ฒ˜๋Ÿผ ๋กœ๊น…ํ•˜๊ธฐ

2023. 7. 31. 17:20ใ†Study_Develop/์ธํ”„๋Ÿฐ - Slack ํด๋ก ์ฝ”๋”ฉ(๋ฐฑ์—”๋“œ)

๋ฐ˜์‘ํ˜•

 

 

express์—์„œ ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด app.use(morgan()) ๋ผ๊ณ  ํ•ด๋„ ๋œ๋‹ค.

์ด๋ฅผ, global middleware๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

Moragn ๋ชจ๋“ˆ์ด๋ž€?

 

HTTP request logger middleware for node.js : node.js๋ฅผ ์œ„ํ•œ ์š”์ฒญ๋“ค์— ๋Œ€ํ•œ ๋กœ๊ฑฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด!

 

์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์–ด๋–ค ์š”์ฒญ์„ ํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ์‘๋‹ตํ–ˆ๋Š”์ง€ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋ชจ๋“ˆ

 

์ด๋Ÿฐ ๋ชจ๋“ˆ์€ ์ง์ ‘ ๋ฏธ๋“ค์›จ์–ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์‹ค๋ฌด์—์„  ๊ทธ๋ƒฅ Morgan์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธด ํ•˜์ง€๋งŒ, nest์—์„œ ์ผ๋ฐ˜ ๋ฏธ๋“ค์›จ์–ด๋กœ ์ด๋Ÿฐ ์—ญํ• ์„ ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•ด๋ณด์•˜๋‹ค.

 

 

- src ์•ˆ์— middlewaresํด๋” ์•ˆ์— logger.middleware.ts๋ฅผ ๋งŒ๋“ ๋‹ค

 

export class LoggerMiddleware implements NestMiddleware {

 

-> NestMiddelware๋ฅผ implementํ•ด์„œ LoggerMiddelware๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

 

-> ์—ฌ๊ธฐ์„œ implements๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฐ•์ œ์‚ฌํ•ญ์ด ์ƒ๊ธด๋‹ค.

 

-> private logger = new Logger('HTTP'); ๋Š” context๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์žฅ์ด๋„ซ, ์ถœ๋ ฅ๋ฌธ์ด ๋งŽ์„ ๋•Œ ์ด ์ถœ๋ ฅ๋ฌธ์ด ์–ธ์ œ ์ƒ๊ธฐ๋Š” ๊ฑด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

 

 

 

  use(request: Request, response: Response, next: NextFunction) : void {

}

 

-> ์œ„์˜ ์ฝ”๋“œ ๋ถ€๋ถ„๋งŒ ๋ณด๋ฉด express์˜ middleware ๊ตฌ์กฐ์™€ ๊ฐ™๋‹ค.

 

-> ์ธ์ž๋กœ req, res, next๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋ฐ›์€ request ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

 

 

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  private logger = new Logger('HTTP');

  use(request: Request, response: Response, next: NextFunction) : void {
    const { ip, method, originalUrl } = request;
    const userAgent = request.get('user-agent') || '';

    response.on('finish', () => {
      const { statusCode } = response;
      const contentLength = response.get('content-length');
      this.logger.log(
        `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
      );
    });
    next();
  }
}

 

-> ์ดํ›„์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ next() ์ธ๋ฐ ๊ทธ ์ด์œ ๋Š” on()ํ•จ์ˆ˜๋Š” ๋ผ์šฐํ„ฐ ์‹คํ–‰์ด ๋๋‚ฌ์„ ๋•Œ 'finish'๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ทธ ์ „์— ๋น„๋™๊ธฐ๋กœ ์ธํ•ด next()ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

-> ๋ผ์šฐํ„ฐ ์‹คํ–‰์ด ๋๋‚ฌ์„ ๋•Œ๋Š” on() ํ•จ์ˆ˜์—์„œ response์˜ ์ •๋ณผ๋ฅด ์ €์žฅํ•˜์—ฌ this.logger.logํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

 

-> ๋งŒ์•ฝ context๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, Logger.log()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

 

-> Nest.js์—์„œ๋Š” console.log() ๋Œ€์‹  Logger๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž!

(์ด์œ  : console.log๋Š” ์–ด๋””์„œ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ๋Š”์ง€ ์ถ”์ ์ด ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ)

 

 

์•„๋ž˜ ์˜ˆ์‹œ>

 

new Logger('HTTP');

 

- HTTP๊ฐ€ context ์ด๋‹ค.

 

- http๊ด€๋ จ๋œ ์š”์ฒญ๋“ค์€ ํŠน๋ณ„ํ•˜๊ฒŒ this.logger์—์„œ ๋ณด์—ฌ์ค€๋‹ค.

 

 

module.ts>

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }

 

-> middleware์—ฐ๊ฒฐ์„ ์œ„ํ•ด, consumer ์—์„œ ๊บผ๋‚ด์„œ LoggerMiddeleware๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.