โ ์ธ๊ตญ์ด ๋ณด๋ค ์ฝ๋ฉ์ ๋จผ์ ๋ฐฐ์๋ผ. โ
- Tim Cook
์ ํ CEO

morgan ๋ชจ๋
morgan์ ์ฐ๊ฒฐ ํ ํฌํธ์ ์ ์ํ๋ฉด ๊ธฐ์กด ๋ก๊ทธ ์ธ์ ์ถ๊ฐ์ ์ธ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์๋ค.
์ ์ฝ๋๋ฅผ ์คํํ์ฌ 3000๋ฒ ํฌํธ์ ๋ค์ด๊ฐ ํ ์ฝ์์ ๋ณด๋ฉด ์๋์ ๊ฐ์ ๋ก๊ทธ๊ฐ ์ฐํ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.

๋ง์ง๋ง ๋ก๊ทธ๋ 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.
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.