AWS ELB를 사용할 때 express morgan 로깅 주의점

  • morgan 로깅할 때, 사용자의 ip를 기록하는
  • :remote-addr 토큰은 req.ip 를 사용한다
  • ELB, 로드밸런서를 사용하면 사용자의 ip가 아니라, ELB의 ip가 기록된다
  • 그래서 사용자의 ip를 가져오려면 x-forwarded-for 헤더의 내용을 봐야한다
1
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

morgan custom

app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(...)

app.use(
morgan(
function (tokens, req, res) {
return [
req.headers['x-forwarded-for'] || req.connection.remoteAddress,
req.ip, // == :remote-addr
tokens.method(req, res),
tokens.url(req, res),
tokens.status(req, res),
].join(' ');
},
{
skip: function (req, res) {
return res.statusCode < 400;
},
}
)
);

(...)
  • 이런식으로 커스텀할 수 있다
  • req.headers['x-forwarded-for']의 내용은
1
X-Forwarded-For: <client>, <proxy1>, <proxy2>
  • 이런식으로 가장 앞의 ip가 사용자 ip이다
  • 뒤로 ,로 나열되는 ip는 프록시임으로 당황하지 말자
1
2
3
4
5
{
skip: function (req, res) {
return res.statusCode < 400;
},
}
  • morgan(f(), {})
  • morgan 두번째 인자로 옵션을 넣을 수 있다
  • skip을 주면 특정 경우에서 로깅을 하지 않는 옵션이다
  • return res.statusCode < 400;이런식으로 하면 400이하의 스테이터스 코드일 때,
  • 로깅을 하지 않는다는 의미이다
  • 이 경우 404, 500 같은 에러들만 로깅된다

참고