웹서버/OHS

[정보] OHS 접근로그(Access Log) 이해

투칼론 2018. 4. 18. 22:30
반응형

1. 개요


웹서버는 클라이언트에서 HTTP 서비스 호출 시에 IP 정보, 호출시간, 응답코드, 응답 바이트 수 등 정보 등을 포함한 접근 로그 보통, access log를 기록한다.

access 로그를 기록하는데 있어서 3개의 지시자 - TransferLog, CustomLog, LogFormat - 를 이해해야 한다.

가장 자주 사용되고 있는 로그 관련 설정은 아래 예시와 같다.


로그 포맷은 대부분 웹서버에서 표준으로 지원하는 CLF(Common Log Format) 형식으로 기록한다.



2. 지시자 - CustomLog, LogFormat, TransferLog


예시를 보면서 이해하는 것이 가장 빠르다.



예시#1) CustomLog 사용


 ......

 LogFormat  "%h %l %u %t \"%r\" %>s %b" common

 CustomLog  logs/access.log   common

 ......


위의 예시에서 보듯이 2개의 지시자를 활용해 로그 파일(logs/access.log)과 로그 포맷(common 별칭)을 지정하는 것을 볼 수 있다.


참고로, 위의 예시는 아래와 같이도 지정할 수 있다.


CustomLog  logs/access.log   "%h %l %u %t \"%r\" %>s %b"



예시#2) TransferLog 사용


 ......

 LogFormat  "%h %l %u %t \"%r\" %>s %b" common

 TransferLog  logs/access.log

 ......


CustomLog는 로그 포맷 별칭(위에서 common)을 사용하지만, TransferLog 지시자는 맨 마지막에 선언된 LogFormat 기준의 로그포맷으로 로그를 쌓는다.



3. 로그 순환 (Log Rotation)


접근 로그에 쌓이는 정보량은 엄청나다. 그러므로, 차후에 로그 분석 등을 위해서 특정 시점에서 로그 파일을 분할하여 저장하는 것이 좋다. 이를 위한 방법으로 "|" 파이프라인과 "rotatelogs" 프로그램을 활용한다.

예시는 아래와 같다.


 CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common 


위의 예시는 86400초(24시간) 마다 로그를 순환한다.

OHS는 Apache의 rotatelogs 명령어에 추가적인 기능을 제공하는 odl_rotatelogs를 지원하고, 에러 로그와 접근 로그에 모두 사용한다.
odl_rotatelogs는 Apache의 rotatelogs 명령어의 모든 기능은 물론 추가적으로 로그 파일 보관 주기를 설정할 수 있는 기능을 제공한다.

아래는 odl_rotatelogs 사용 문법이다.

 odl_rotatelogs [-u:offset] logfile {size-|time-based-rotation-options}




[참고] 로그 포맷 설명


형식 문자열설명
%%퍼센트 기호
%...a원격 IP-주소
%...A(서버) IP-주소
%...BHTTP 헤더를 제외한 전송 바이트수.
%...bHTTP 헤더를 제외한 전송 바이트수. CLF 형식과 같이 전송한 내용이 없는 경우 0 대신 '-'가 나온다.
%...{Foobar}C서버가 수신한 요청에서 Foobar 쿠키의 내용.
%...D요청을 처리하는데 걸린 시간 (마이크로초 단위).
%...{FOOBAR}e환경변수 FOOBAR의 내용
%...f파일명
%...h원격 호스트
%...H요청 프로토콜
%...{Foobar}i서버가 수신한 요청에서 Foobar: 헤더의 내용.
%...l(있다면 identd가 제공한) 원격 로그인명. mod_ident가 있고 IdentityCheck가 On이 아니면 빼기기호를 기록한다.
%...m요청 메써드
%...{Foobar}n다른 모듈이 기록한 Foobar 노트(note) 내용.
%...{Foobar}o응답의 Foobar: 헤더 내용.
%...p요청을 서비스하는 서버의 정규 포트
%...P요청을 서비스하는 자식의 프로세스 ID.
%...{format}P요청을 서비스하는 자식의 프로세스 ID 혹은 쓰레드 ID. format에는 pid와 tid가 가능하다.
%...q질의문자열 (질의문자열이 있다면 앞에 ?를 붙이고, 없다면 빈 문자열)
%...r요청의 첫번째 줄
%...s상태(status). 내부 리다이렉션된 요청의 경우 *원래* 요청의 상태이다. 최종 요청의 상태는 %...>s.
%...tcommon log format 시간 형식(표준 영어 형식)의 시간
%...{format}tstrftime(3) 형식 format의 시간. (지역시간일 수 있음)
%...T요청을 처리하는데 걸린 시간 (초 단위).
%...u원격 사용자 (auth가 제공하며, 상태(%s)가 401인 경우 이상한 값을 나올 수 있음)
%...U질의문자열을 제외한 요청 URL 경로.
%...v요청을 서비스한 서버의 정규 ServerName.
%...VUseCanonicalName 설정에 따른 서버명.
%...X응답을 마쳤을때 연결 상태.
X =응답을 마치기 전에 연결이 끊어졌다.
+ =응답을 보낸후에도 연결이 살아있다(keep alive).
- =응답을 보낸후 연결이 끊어졌다.

(아파치 1.3 후반 버전에서 이 지시어는 %...c였지만, 전통적인 ssl %...{var}c 문법과 겹쳐서 변경했다.)

%...I요청과 헤더를 포함한 수신 바이트수로 0일 수 없다. 이를 사용하려면 mod_logio가 필요하다.
%...O헤더를 포함한 송신 바이트수로 0일 수 없다. 이를 사용하려면 mod_logio가 필요하다.

[참조] https://httpd.apache.org/docs/2.4/ko/logs.html