로그는 모든 웹 서버에 비종속적으로 사용하기 위해서 Common Log Format(CLF)라는 포맷을 사용하고 있다.
이 포맷은 클라이언트의 요청에 대한 로그를 각각의 줄로 기록을 하게 되며, 한 중에서는 스페이스로 구별을 하여 로그 정보를 적고 있다. 이 파일 포맷은 거의 모든 웹 서버에서 지원을 하고 있으나 때에 따라서 웹 서버를 만든 제작사의 포맷 또는 DB에 바로 저장할 수 있는 기능을 가지고 있는 웹 서버도 있다.
로그를 기록하기 위한 지시자는 TransferLog, LogFormat, CustomLog 세 개의 지시자이다.


1. TransferLog

Syntax : TransferLog file-pipe

TransferLog는 로그를 적을 파일 또는 프로그램을 지정할 수 있다. 로그는 파일에 적을 수도 있지만 특정 파이프 라인을 통해서 프로그램으로 바로 전달할 수도 있다.
TransferLog 지시자에는 특정 로그 포맷을 지정할 수 없기 때문에 가장 나중에 정의한 LogFormat을 사용한다. 특정 로그 포맷이 정의되지 않았다면 CLF 로그 파일 포맷을 따르게 된다.

예를 들어서 간략하게 A,B,C 세 개의 로그 포맷을 지정했다면 TransferLog가 사용하는 로그 포맷은 LogFormat C를 사용하게 된다.

 

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
TransferLog logs/access.log

위의 예제는 C 포맷을 사용한다. 로그가 쌓일 대상 파일은 logs/access.log 파일이다. 이 매개 변수가 "/"로 시작하지 않았기 때문에 ServerRoot 밑에 있는 logs 디렉토리에서 access.log 파일에 로그를 적게 되는 것이다. 만약에 "/"로 경로가 시작되었다면 이 경로는 절대 경로가 된다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

TransferLog logs/access.log 


2. CustomLog

Syntax : CustomLog file-pipe format-or-nickname

CustomLog는 TransferLog와 똑 같은 기능을 지니고 있는 지시자이지만 매개 변수에 포맷을 따로 지정하거나 가칭을 적을 수 있다.

LogFormat "포맷형식" A
LogFormat "포맷형식" B
LogFormat "포맷형식" C
CustomLog logs/access.log A

 

위와 같이 로그 파일을 정의했다면, LogFormat에서 A 라고 별명을 달아논 포맷을 가지고 logs/access.log 파일에 로그를 적게 된다. 물론 이 별칭 대신에 포맷을 직접 적어도 상관이 없다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/access.log agent


3. LogFormat

Syntax : LogFormat format [nickname]
               Default: LogFormat "%h %l %u %t \"%r\" %s %b"

LogFormat은 CLF 로그 포맷과 별도로 관리자가 정의한 로그 파일 형식을 만들기 위해서 사용이 되어진다.

다음 표는 로그 포맷에서 사용이 되어지는 변수들이다.(포맷에 대한 조금 더 자세한 내용은 Apache HTTP Server Project 를 참조)

 

변수   설명
%% : 퍼센트 기호
%...a : 요청한 클라이언트의 IP주소(원격 IP주소)
%...A : 로컬 IP 주소(서버 IP주소)
%...B : HTTP 헤더를 제외한 전송 바이트의 수
%...b : HTTP 헤더를 제외한 전송 바이트의 수. 전송 바이트가 없는 경우에 CLF에서 0으로
   표기하지 않고 '-'로 표기한다.
%...{Foobar}C : 서버가 수신한 요청에서 Foobar 쿠키의 내용
%...D : 요청을 처리하는데 걸린 시간(마이크로초 단위)
%...{Foobar}e : Foobar라는 환경 변수
%...f : 파일명
%...h : 요청한 원격 호스트(예:210.210.210.10)
%...H : 요청 프로토콜(예:HTTP/1.1)
%...{Foobar}i : Foobar의 내용-서버에 요청을 할 때의 헤더에 있는 내용
%...l : 리모트 로그인 이름(identd 데몬으로 부터 얻어 올 수 있을 때, 없을 경우 - 표시)
%...m : 요청 메소드(예:GET 또는 POST)
%...{Foobar}n : 다른 모듈에서 "Foobar"의 내용
%...{Foobar}o : Foobar의 내용 - 응답에서 헤더에 있다
%...p : 응답을 처리해준 서버의 포트(예:80)
%...P : 응답을 처리해준 차일드 프로세스의 프로세스 번호(예:14633)
%...{format}P : 요청을 서비스하는 자식의 프로세스 ID 혹은 쓰레드 ID. format에는 pid와 tid가
   가능하다
%...q : 쿼리 스트링(예:http://www.webnkorea.com/server-status?refresh=5라고 하면
   '?refresh=5' 가 기록된다. 쿼리 스트링이 없으면 빈 공백이 들어간다)
%...r : 요청을 할때의 첫 라인(index.html을 요청을 했다면 다음과 같이 기록 된다.
   (GET/HTTP/1.1)
%...s : 요청에 대한 서버의 상태
%...t : 요청을 받은 시간, CLF에서 시간과 같다(영어로 표기됨)
%...{format}t : 주어진 형식의 시간. strtime(3) 포맷으로 주어져야 한다.
%...T : 서버가 요청을 처리하는 데 걸리는 시간(초)(예:1초 미만일 경우 '0'으로 표기)
%...u : 원격 사용자 이름
%...U : 요청한 URL
%...v : 요청에 대해서 처리를 한 서버 이름(예:www.webnkorea.com)
%...V : UseCanonicalName 설정에 따른 요청에 대해서 처리한 서버 이름
%...I : 요청과 헤더를 포함한 수신 바이트수로 0일 수 없다.(영문자 아이임)
   (사용하려면 mod_logio가 필요하다)
%...O : 헤더를 포함한 송신 바이트수로 0일 수 없다.(사용하려면 mod_logio가 필요하다)

 

LogForamt 지시자에서 위의 변수들을 사용해서 마음대로 로그 포맷을 바꿀 수 있다. 자신이 모니터링하고 싶은 정보만을 로그에 기록함으로써 가독성을 늘리고 데이터의 크기를 줄일 수 있다.


4. 다중 로그 파일
현재의 아파치 버전에서는 하나의 요청에 대해서 여러 개의 로그 파일을 만들 수 있다. 만약 두 개의 로그 파일을 만든다고 가장할 때 하나는 디폴트인 CLF 포맷을 사용할 수 있고 다른 하나는 자신이 정의한 포맷을 지정해서 사용할 수도 있다.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

TransferLog logs/access.log

LogFormat "%u %U %p" my

CustomLog logs/access.log my


TransferLog 앞에는 어떠한 LogFormat도 지정하지 않으면 기본적으로 CLF 포맷으로 로그를 만들게 된다. 다음에 LogFormat 지시자를 사용해서 포맷을 지정하고 별칭을 my로 지정한 후 CustomLog 지시자를 사용해서 자신이 원하는 로그 포맷을 사용할 수 있다.

이 로그 형식은 가상 사이트 컨테이너인 <Virtual></Virtual>에서 따로 로그에 대한 설정을 하지 않는다면 메인 프로세스의 로그 파일에 로그자 저장된다.


5. TIP(가상 호스트에 대한 효율적인 로그 관리)
일반적으로 가상 호스트에 대해서 따로 로그를 관리하지는 않지만, 웹호스팅을 하는 업체라면 고객으로 부터 자신의 사이트에 대한 통계를 요청받는 경우가 있다. 이러한 경우, 효율적으로 로그를 관리하기 위해서 가상 호스트에 대해서 따로 로그를 만들어 줄 필요가 있다. 물론 한 파일에서 관리한 다음 각각의 가상 호스트에 대한 로그로 필터링을 하면 되겠지만, 아무래도 개별 파일에서 관리하는 것 보다 깔끔하지 않다.

 

그래서 log 디렉토리 밑에 logs/vhost 라는 디렉토리를 만든 다음 도메인 이름명을 따서 로그 파일을 만드는 방법이 유용하다. 따라서 webnkorea.com 이라는 가상 호스트가 있다면, <Virtual></Virtual> 컨테이너 안에 로그 파일에 대한 설정을 다음과 같이 해 준다.


CustomLog logs/vhost/diverman.com-access_log "Format"

이렇게 하면 각각의 가상 호스트에 대해서 로그 파일을 관리해 줄 수 있다. 좀 더 신경을 쓴다면 rotatelog 데몬을 이용해서 로그가 일정 크기 이상 증가하지 않도록 해 주는 것도 좋을 것이다.

출처: https://berry2.tistory.com/entry/Apache-Access-Log-Format [베리베리 지식창고:티스토리]