-
로그(log)란 무엇인가CS지식/네트워크 2021. 7. 18. 23:09
우리는 지금까지 클라이언트와 서버가 HTTP를 통해 서로 통신을 하는 것을 배웠다.
클라이언트는 수 많은 요청을 보낼 것이고 서버는 그에 대한 응답을 해준다.
이러한 상황에서 모든 서버와 중개자로 사용되는 프락시는 처리했던 HTTP 트랜잭션을 요약해서 기록해 놓는데 이를 로그라고 한다.
그러면 지금부터 어떠한 정보를 로그로 남기는지, 로그 포맷을 어떠한지 알아보자.
로그는 왜 남길까?
로그는 남기는 이유는 보통 서버나 프락시의 문제를 찾거나 웹 사이트 접근 통계를 내기위해 진행된다.
로깅을 통해 나온 통계는 마케팅, 장비 조달 계획 등을 세우는데 유용하게 쓰일 수 있다.
그렇다고해서 모든 HTTP 트랜잭션의 헤더를 로그로 남긴다면 너무나 많을 것이고 감당하기 힘든 데이터가 될 것이다.
그래서 보통 트랙잭션의 기본적인 항목들만 로깅한다. 일반적으로 로깅하는 필드는 아래와 같다.
- HTTP 메서드
- 클라이언트와 서버의 HTTP 버전
- 요청받은 리소스의 URL
- 응답의 HTTP 상태 코드
- 요청과 응답 메시지의 크기 (모든 엔티티 본문 포함)
- 트랜잭션이 일어난 시간
- Referer와 USer-Agent 헤더 값
이렇게 일반적으로 로깅하는 필드는 로그를 보는 사람들에게 어떠한 정보를 주는 것일까?
HTTP 메서드와 URL을 통해서는 어떠한 요청이 어떠한 일을 진행하려 했는지를 알 수 있다.
또한, URL은 특정 페이지가 얼마나 많이 조회되었는지를 통계를 내어 유익한 정보를 얻어낼 수 있다.
버전 정보는 클라이언트와 서버 간에 문제가 생겼을 때 디버깅하는 데 도음이 될 수 있다.
HTTP 상태 코드는 요청이 성공적으로 이루어졌는지, 인증 시도가 실패했는지, 리소스를 찾았는지 등 요청에 대해 어떠한 응답이 일어났는지를 알려줄 수 있다.
로그 포맷은 어떠할까
로그 포맷에는 여러 표준이 존재하는데 지금부터 몇 가지에 대해 알아보자.
1) 일반 로그 포맷(Common Log Format)
가장 일반적으로 사용하는 포맷으로 많은 서버가 일반 로그 포맷을 사용한다.
일반 로그 포맷에 담기는 필드는 아래의 표와 같다.
필드 설명 remotehost 요청한 컴퓨터의 호스트 명 혹은 IP 주소 username ident 검색을 수행했을 경우에 인증된 요청자의 사용자 이름 auth-username 인증을 수행했을 경우에 인증된 요청자의 사용자 이름 timestamp 요청 날짜와 시간 request-line HTTP 요청 메시지에서 행을 그대로 기술
ex) POST/ index.html HTTP/1.1response-code 응답으로 보내는 HTTP 상태 코드 response-size 응답 엔티티의 Content-length 2) 혼합 로그 포맷(Combined Log Format)
일반 로그 포맷과 같이 많이 사용하는 로그 포맷 중 하나로 일반 로그 포맷과 거의 유사하다.
위에서 본 일반 로그 포맷 필드에 2개의 필드가 추가되었다.
필드 설명 Referer Referer HTTP 헤더의 값 User-Agent User-Agent Referer HTTP 헤더의 값 Referer 필드는 해당 URL을 클라이언트가 어디서 찾았는지에 대한 정보를 제공하고 User-Agent 필드는 요청을 만든 HTTP 클라이언트 애플리케이션이 무엇인지 알고자 할때 정보를 얻을 수 있다.
3) 넷스케이프 확장 로그 포맷
넷스케이프 확장 로그 포맷은 일반 로그 포맷에서 비롯됐지만 프락시나 웹 캐시 같은 HTTP 애플리케이션과 연관이 있는 여러 환경을 지원하고자 포맷을 확장한 것이다.
넷스케이프 확장 로그 포맷의 처음 7개의 필드는 일반 로그 포맷의 필드와 동일하고 그 외에 새로운 필드를 추가하였다.
추가한 새로운 필드는 아래의 표와 같다.
필드 설명 proxy-response-code 트랙잭션이 프락시를 거칠 경우에 서버가 프락시에게 보내는 HTTP 응답 코드 proxy-response-size 트랙잭션이 프락시를 거칠 경우에 서버가 프락시에게 보내는 응답 엔티티의 Content-length client-request-size 클라이언트가 프락시로 보내는 요청의 본문이나 엔티티의 content-length proxy-request-size 트랜잭션이 프락시를 거칠 경우에 프락시가 서버로 보내는 요청의 본문이나
엔티티의 content-lengthclient-response-hdr-size 클라이언트 요청 헤더의 바이트 길이 proxy-response-hdr-size 트랙잭션이 프락시를 거칠 경우에 프락시가 요청자에게 보내는 응답 헤더의 바이트 길이 proxy-request-hdr-size 트랙잭션이 프락시를 거칠 경우에 서버가 프락시가 서버로 전송하는 요청 헤더의 바이트 길이 server-response-hdr-size 서버 응답 헤더의 바이트 길이 proxy-timestamp 트랜트랙잭션이 프락시를 거칠 경우에 요청과 응답이 프락시를 통해 오가는 총 시간 4) 넷스케이프 확장2 로그 포맷
넷스케이프 확장 2 로그 포맷은 이름에서 알 수 있듯이 기존의 넷스케이프 확장 로그 포맷에 필드를 추가한 것이다.
추가된 필드의 정보를 통해 HTTP 클라이언트와 HTTP 프락시 애플리케이션 간의 통신을 설계하는 데 도움이 된다.
추가된 필드는 아래의 표와 같다.
필드 설명 route 프락시가 클라이언트의 요청을 만드는 데 사용하는 경로 client-finish-status-code 클라이언트의 종료 상태 코드로 클라이언트가 프락시로 보낸 요청이 성공적으로 완료되었는지(FIN), 인터럽트에 걸렸는지(INTR) 기술 proxy-finish-status-code 프락시의 종료 상태 코드로 프락시가 서버로 보낸 요청이 성공적으로 완료되었는지(FIN), 인터럽트에 걸렸는지(INTR) 기술 cashe-result-code 캐시 결과 코드로 캐시가 요청에 어떻게 응답했는지 기술 route 필드에 작성될 수 있는 값(코드)로는 아래와 같다.
- DIRECT: 리소스를 서버에서 바로 가져왔다를 의미
- PROXY(host:port): 리소스를 host라는 프락시를 통해 가져왔다를 의미
- PROXY(socks:port): 리소스를 host라는 SOCKS 서버를 통해 가져왔다를 의미
client-finish-status-code와 proxy-finish-status-code에 작성될 수 있는 값(코드)는 아래와 같다.
- -: 요청이 시작되지 않았음을 의미
- FIN: 요청이 성공적으로 완료됐음을 의미
- INTR: 요청이 클라이언트에 의해 중단됐거나 프락시/서버에 의해 중단됐음을 의미
- TIMEOUT: 오청이 프락시/서버의 타임아웃에 걸렸음을 의미
cashe-result-code에 작성될 수 있는 값(코드)는 아래와 같다.
- -: 캐시할 수 없는 리소스를 의미
- WRITTEN: 리소스를 캐시에 저장했다는 것을 의미
- REFRESHED: 리소스를 캐시했고 갱신했다는 것을 의미
- NO-CHECK: 캐시된 리소스를 반환했고 신선도 검사를 하지 않았음을 의미
- UP-TO-DATE: 캐시된 리소스를 반환했고 신선도 검사를 완료했음을 의미
- HOST-NOT-AVAILABLE: 캐시된 리소스를 반환했으며 원격 서버가 사용할 수 있는 상태가 아니었기때문에 신선도 검사를 하지 않았음을 의미
- CL-MISMATCH: content-length가 리소스의 크기와 맞지 않았기 떄문에 리소스를 캐시에 저장하지 않았음을 의미.
- ERROR: 어떠한 에러 때문에 리소스를 캐시에 저장하지 못했음을 의미
'CS지식 > 네트워크' 카테고리의 다른 글
HTTP/2.0이란 무엇인가 (0) 2021.07.16 내용 협상(content negotiation)이란 무엇인가 (0) 2021.07.12 HTTPS란 무엇인가 (0) 2021.06.23 다이제스트 인증이란 무엇인가 (0) 2021.06.20 HTTP 인증이란 무엇인가 (0) 2021.06.17