Apache | 로그 파일 | 액세스 로그 포멧 (LogFormat)
액세스 로그로 저장하는 데이터는 직접 커스텀마이징하여 형식을 지정할 수 있다.
로그 형식 : LogFormat
로그 형식은 “LogFormat"으로 지정한다. 문법은 다음과 같다.
LogFormat "포맷" 로그-형식-이름
기본적으로 “httpd.conf” 파일에 작성되어 있는 로그 형식으로는 다음의 두 가지가 정의되어 있다.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
로그 형식 이름으로 “common"과 “combined"의 두 가지가 있다. 형식은 여러 항목의 조합에 의해 정의되었고, 설정 가능한 주요 항목은 다음과 같다.
설정값 | 의미 |
---|---|
%a | 액세스한 IP 주소 |
%A | 서버 (Apache)의 IP 주소 |
%B | 전송된 바이트 수 (헤더는 제외) |
%b | 전송된 바이트 수 (헤더는 제외), 0바이트인 경우는 ‘-‘이 표시된다. |
%f | 요청된 파일 이름 |
%h | 원격 호스트 이름 |
%H | 요청 프로토콜 이름 |
%l | 클라이언트 식별자 |
%m | 요청 메소드명 |
%q | 요청에 포함된 쿼리 문자열, 공백 이외는 “?“가 붙는다. |
%r | 요청의 첫 번째 행의 값 |
%s | 응답 상태 |
%>S | 마지막 응답의 상태 |
%t | 시간 |
%T | 처리하는데 걸린 시간 |
%u | 인증 사용자명 |
%U | 요청의 URL 경로 |
%v | 요청에 대한 가상 호스트 이름 |
%V | UseCanonicalName 따른 서버명. |
%X | 연결 상태 |
%{쿠키명}C | 요청에 포함된 쿠키 값 |
% {환경변수명}e | 환경 변수명의 값 |
%{헤더명}i | 요청에 포함된 헤더명의 값 |
%{헤더명}o | 응답에 포함된 헤더명의 값 |
%{메모}n | 모듈에서 반환한 메모의 값 |
%{포맷}t | 포맷된 시간 |
이러한 항목을 열거하고 쌍따움표( “)로 감싸서 지정한다. 포맷 중에 쌍따움표을 작성하는 경우는 역슬레쉬(”")으로 이스케이프하여 작성한다.
항목 중에는 중괄호({})로 감싸서 작성하는 항목이 있는데, 예를 들어, “%{헤더명}i"는 헤더 중에서 헤더명에 지정한 값을 받아와서 기록한다. “%{User-Agent}i"라고 지정할 경우에는 헤더에서 “User-Agent"의 값을 기록한다.
액세스 로그 포맷 변경 테스트
기본으로 활성화되어 있는 액세스 로그는 “common"이다. 하나 더 준비어 있는 “combined"으로 변경해보도록 하자. “httpd.conf” 파일의 내용중에 다음과 같이 작성된 부분이 있다.
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog "logs/access.log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "logs/access.log" combined
“CustomLog logs / access.log common"앞에 “#“를 붙이고, 대신에 “CustomLog logs / access.log combined"이전 “#“을 제거한다.
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog "logs/access.log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog "logs/access.log" combined
이것으로 액세스 로그는 “combined” 이름으로 정의된 형식으로 저장될 수 있다. Apache를 재시작한 후 Apache에 적당히 액세스 로그를 확인해 보자.
::1 - - [06/Dec/2019:00:48:42 +0900] "GET /admin/admin.html HTTP/1.1" 404 196 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
127.0.0.1 - - [06/Dec/2019:00:49:03 +0900] "GET / HTTP/1.1" 200 46 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
127.0.0.1 - - [06/Dec/2019:00:49:03 +0900] "GET /favicon.ico HTTP/1.1" 404 196 "http://127.0.0.1/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
127.0.0.1 - - [06/Dec/2019:00:49:24 +0900] "GET /phpinfo HTTP/1.1" 404 196 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
127.0.0.1 - - [06/Dec/2019:00:49:34 +0900] "GET /phpinfo.php HTTP/1.1" 200 72966 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
위 내용이 새로운 포맷으로 기록된 로그이다. 더 자세한 정보가 기록이 된 것을 볼 수 있다.