Node.js/Express

[EXPRESS] ๐Ÿ“š morgan ๋ฏธ๋“ค์›จ์–ด ๐Ÿ’ฏ ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

์ธํŒŒ_ 2021. 11. 2. 12:32

morgan

morgan ๋ชจ๋“ˆ

morgan์— ์—ฐ๊ฒฐ ํ›„ ํฌํŠธ์— ์ ‘์†ํ•˜๋ฉด ๊ธฐ์กด ๋กœ๊ทธ ์™ธ์— ์ถ”๊ฐ€์ ์ธ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ 3000๋ฒˆ ํฌํŠธ์— ๋“ค์–ด๊ฐ„ ํ›„ ์ฝ˜์†”์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ฐํ˜€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

morgan

๋งˆ์ง€๋ง‰ ๋กœ๊ทธ๋Š” morgan ๋ฏธ๋“ค์›จ์–ด์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ morgan์€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฝ˜์†”์— ๊ธฐ๋กํ•œ๋‹ค.

const express = require('express');
const path = require('path');
const morgan = require('morgan'); // ๋ฏธ๋“ค์›จ์–ด ์—ฐ๊ฒฐ

const app = express();
app.set('port', process.env.PORT || 3000);

// ๋กœ๊ทธ ๊ธฐ๋ก
if (process.env.NODE_ENV === 'production') { 
   app.use(morgan('combined')); // ๋ฐฐํฌํ™˜๊ฒฝ์ด๋ฉด
} else {
   app.use(morgan('dev')); // ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด๋ฉด
}

app.get('/', (req, res) => { 
   res.send('Hello, index');
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘');
});

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์ธ์ˆ˜๋กœ dev๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ ์ด ์™ธ์— combined, common, short, tiny ๋“ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 - ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” dev๋ฅผ, ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋Š” combined๋ฅผ ์ด์šฉํ•˜๋ฉด ์ข‹๋‹ค.

// combined๋ฅผ ํ•˜๋ฉด ๋กœ๊ทธ๊ฐ€ ๋” ์ž์„ธํ•ด์ง„๋‹ค.
app.use(morgan('combined'));
::1 - - [02/Nov/2021:01:36:21 +0000] "GET /about HTTP/1.1" 404 144 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"

margan ์˜ต์…˜๋“ค

 

morgan

HTTP request logger middleware for node.js. Latest version: 1.10.0, last published: 2 years ago. Start using morgan in your project by running `npm i morgan`. There are 7818 other projects in the npm registry using morgan.

www.npmjs.com

morgan(format, options)
  • morgan ๋กœ๊ฑฐ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ format, options์„ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.
  • format์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ด๋ฆ„์˜ ๋ฌธ์ž์—ด(์•„๋ž˜ ์ฐธ์กฐ), ํ˜•์‹ ๋ฌธ์ž์—ด, ๋˜๋Š” ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

[format]

 

combined

  • ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ
  • ๋ถˆํŠน์ • ๋‹ค์ˆ˜๊ฐ€ ์ ‘์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— IP๋ฅผ ๋กœ๊ทธ์— ๋‚จ๊ฒจ์คŒ
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"

 

common

:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]

 

dev

  • ๊ฐœ๋ฐœ์šฉ์„ ์œ„ํ•ด response์— ๋”ฐ๋ผ ์ƒ‰์ƒ์ด ์ž…ํ˜€์ง„ ์ถ•์•ฝ๋œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅ.
  • :status๊ฐ’์ด ๋นจ๊ฐ„์ƒ‰์ด๋ฉด ์„œ๋ฒ„ ์—๋Ÿฌ์ฝ”๋“œ, ๋…ธ๋ž€์ƒ‰์ด๋ฉด ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ ์ฝ”๋“œ, ์ฒญ๋ก์ƒ‰์€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ฝ”๋“œ, ๊ทธ์™ธ ์ฝ”๋“œ๋Š” ์ปฌ๋Ÿฌ๊ฐ€ ์—†๋‹ค.
:method :url :status :response-time ms - :res[content-length]

 

short

  • ๊ธฐ๋ณธ ์„ค์ •๋ณด๋‹ค ์งง์€ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์‘๋‹ต ์‹œ๊ฐ„์„ ํฌํ•จ.
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms

 

tiny

  • ์ตœ์†Œํ™”๋œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅ
:method :url :status :res[content-length] - :response-time ms

[Options]

 

immediate

  • response๋Œ€์‹  request์— ๋”ฐ๋ผ ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 
  • ์„œ๋ฒ„ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ๋„ request๋“ค์€ ๊ธฐ๋ก๋˜์ง€๋งŒ, reponse(response code, ์ปจํ…์ธ  ๊ธธ์ด ๋“ฑ๋“ฑ)์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋กํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ๋‹ค.

 

skip

  • ๋กœ๊น…์˜ ์Šคํ‚ต์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ false. ์ด ํ•จ์ˆ˜๋Š” "skip(req, res)" ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.
morgan('combined', {
	// ์ฝ”๋“œ๊ฐ€ 400 ๋ฏธ๋งŒ๋ผ๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด ๋ฒ„๋ ค์„œ ๋กœ๊ทธ ๊ธฐ๋ก ์•ˆํ•จ.
	// ์ฝ”๋“œ๊ฐ€ 400 ์ด์ƒ์ด๋ฉด ๋กœ๊ทธ ๊ธฐ๋กํ•จ
    skip : function(req, res) { return res.statusCode < 400 } 
});
var http = require('http');
var express = require('express');
var morgan = require('morgan');

var app = express();
var router = express.Router();

// ์ด๊ณณ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅ
router.get('/logging', function(req, res) {
	console.log('access logging');
	res.writeHead(404, { 'Content-Type' : 'text/html' });
	res.end('error!!');
});

// ์ด๊ณณ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋กœ๊ทธ ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ
router.get('/skip', function(req, res) {
	console.log('access skip');
	res.writeHead(200, { 'Content-Type' : 'text/html' });
	res.end('success!!');
});

// Create new Morgan
var myMorgan = morgan('combined', {
	skip : function(req, res) { return res.statusCode < 400 }
});

app.use(myMorgan);
app.use('/', router);

// ์„œ๋ฒ„ ์ƒ์„ฑ ๋ฐ ๋ฆฌ์Šจ
http.createServer(app).listen(10000, function() {
	console.log('Server Start!!');
});

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ๋„์šด ํ›„ http://localhost:10000/logging ๊ณผ http://localhost:10000/skip์— ์ ‘๊ทผํ•˜์—ฌ ๋ณด์ž.

 

stream

  • ๋กœ๊ทธ ์ž‘์„ฑ์„ ์œ„ํ•œ Output stream์˜ต์…˜. ๊ธฐ๋ณธ๊ฐ’์€ process.stdout.