Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > 모듈

#### Please note

This document refers to a legacy release (2.2) of Apache httpd. The active release (2.4) is documented here. If you have not already upgraded, please follow this link for more information.

You may follow this link to go to the current version of this document.

# 아파치 모듈 mod_log_config

가능한 언어: en | ja | ko | tr

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

설명: | 서버로의 요청을 로그에 기록한다
상태: | Base
모듈명: | log_config_module
소스파일: | mod_log_config.c

### 요약

이 모듈은 클라이언트의 요청을 로그에 자유롭게 기록한다. 자신이 원하는 형식으로 로그를 기록할 수 있고, 파일이나 외부 프로그램에 직접 로그를 보낼 수도 있다. 조건적 로그를 사용하면 요청의 성격에 따라 요청을 로그에 추가하거나 제외할 수 있다.

이 모듈은 세가지 지시어를 제공한다. `TransferLog`는 로그파일을 만들고, `LogFormat`은 원하는 형식을 정하고, `CustomLog`는 한번에 로그파일과 형식을 모두 지정한다. `TransferLog`와 `CustomLog` 지시어를 여러번 사용하면 요청을 여러 파일에 기록할 수 있다.

### 주제

- 로그 형식 지정하기
- 보안상 고려할 점

### 지시어들

### 참고

- 아파치 로그파일

- Comments

## 로그 형식 지정하기

`LogFormat`과 `CustomLog` 지시어의 형식 아규먼트는 문자열이다. 이 문자열에 따라 요청을 로그파일에 기록한다. 문자열에는 로그파일에 그대로 복사되는 문자와 행바꿈과 탭을 나타내는 C의 "\n"과 "\t" 제어문자를 사용할 수 있다. 로그파일에 따옴표나 백슬래쉬를 쓰려면 앞에 반드시 백슬래쉬를 적어줘야 한다.

요청의 특징은 형식 문자열에 "`%`" 지시어를 사용하여 기록한다. 이 지시어는 로그파일에서 다음과 같이 변경된다.

형식 문자열 | 설명
--- | ---
`%%` | 퍼센트 기호
`%...a` | 원격 IP-주소
`%...A` | (서버) IP-주소
`%...B` | HTTP 헤더를 제외한 전송 바이트수.
`%...b` | HTTP 헤더를 제외한 전송 바이트수. 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`.
`%...t` | common log format 시간 형식(표준 영어 형식)의 시간
`%...{format}t` | `strftime(3)` 형식 format의 시간. (지역시간일 수 있음)
`%...T` | 요청을 처리하는데 걸린 시간 (초 단위).
`%...u` | 원격 사용자 (auth가 제공하며, 상태(`%s`)가 401인 경우 이상한 값을 나올 수 있음)
`%...U` | 질의문자열을 제외한 요청 URL 경로.
`%...v` | 요청을 서비스한 서버의 정규 `ServerName`.
`%...V` | `UseCanonicalName` 설정에 따른 서버명.

`%...X`

응답을 마쳤을때 연결 상태.

`X` = | 응답을 마치기 전에 연결이 끊어졌다.
`+` = | 응답을 보낸후에도 연결이 살아있다(keep alive).
`-` = | 응답을 보낸후 연결이 끊어졌다.

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

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

"..."에는 (예를 들어, `"%h %u %r %s %b"`) 아무것도 없거나, 항목을 포함할 조건이 나온다 (조건을 만족하지 않으면 자리에 "-"를 기록한다). 조건은 앞에 "!"를 붙이거나 안붙인 HTTP 상태코드 목록으로 작성한다. 예를 들어, "%400,501{User-agent}i"는 400 (Bad Request) 오류와 501 (Not Implemented) 오류일때만 `User-agent:`를 로그에 남기고, "%!200,304,302{Referer}i"는 정상적인 상태가 아닌 모든 요청에 대해 `Referer:`를 로그에 남긴다.

수정자 "<"와 ">"는 내부 리다이렉션된 요청에서 각각 처음 요청을 말할지 마지막 요청을 말할지 선택한다. 기본적으로 `%s, %U, %T, %D, %r`은 처음 요청을 보고, 나머지 `%` 지시어는 마지막 요청을 본다. 그래서 `%>s`는 요청의 마지막 상태(status)를 기록하고, `%<u`는 인증으로 보호하지 않는 자원으로 내부 라다이렉션된 경우에도 처음에 인증한 사용자를 기록한다.

2.0.46 이전의 httpd 2.0 버전은 `%...r`, `%...i`, `%...o`의 결과 문자열을 그대로 두었다. 이유는 Common Log Format의 요구사항을 따르기위해서였다. 즉, 클라이언트가 제어문자를 로그에 집어넣을 수 있기때문에 로그파일을 그대로 다룰 때는 조심해야 한다.

보안상 이유로 2.0.46부터 출력할 수 없는 문자나 다른 특수문자를 `\xhh`로 표현한다. 여기서 hh는 해당 바이트의 16진수 표현을 나타낸다. 이 규칙의 예외는 백슬래쉬를 앞에 붙이는 `"`와 `\`, 그리고 C언어 형식의 공백문자들(`\n`, `\t` 등)이다.

일반적으로 많이 사용하는 로그 형식은 다음과 같다.

Common Log Format (CLF)
  `"%h %l %u %t \"%r\" %>s %b"`
가상호스트 정보를 포함한 Common Log Format
  `"%v %h %l %u %t \"%r\" %>s %b"`
NCSA extended/combined 로그 형식
  `"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""`
Referer 로그 형식
  `"%{Referer}i -> %U"`
Agent (브라우저) 로그 형식
  `"%{User-agent}i"`

요청을 서비스하는 서버의 정규 `ServerName`과 `Listen`은 각각 `%v`와 `%p`를 사용한다. 로그분석 프로그램이 실제로 요청을 서비스하는 호스트를 알기위해 가상호스트 찾기 알고리즘을 가질 필요없도록 이들 값은 `UseCanonicalName` 설정과 무관하다.

## 보안상 고려할 점

서버를 시작하는 사용자외에 다른 사용자가 로그파일을 저장하는 디렉토리에 쓰기 권한을 가질때 왜 보안에 문제가 생기는지 보안 팁 문서를 참고하라.

## BufferedLogs 지시어

설명: | Buffer log entries in memory before writing to disk
문법: | `BufferedLogs On|Off`
기본값: | `BufferedLogs Off`
사용장소: | 주서버설정
상태: | Base
모듈: | mod_log_config
지원: | Available in versions 2.0.41 and later.

The documentation for this directive has not been translated yet. Please have a look at the English version.

## CookieLog 지시어

설명: | 쿠키를 로그에 남기기위해 사용할 파일명을 설정한다
문법: | `CookieLog filename`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | mod_log_config
지원: | 이 지시어는 사용되지 않는다.

`CookieLog` 지시어는 쿠키를 로그에 남기기위해 사용할 파일명을 설정한다. 파일명은 `ServerRoot`에 상대경로이다. 이 지시어는 `mod_cookies`와 호환을 위해 포함했을뿐, 실제 사용되지 않는다.

## CustomLog 지시어

설명: | 로그파일 이름과 형식을 지정한다
문법: | `CustomLog file|pipe format|nickname [env=[!]environment-variable]`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | mod_log_config

서버가 요청을 로그에 남길때 `CustomLog` 지시어를 사용한다. 로그 형식을 지정하고, 환경변수를 사용하여 요청의 특징에 따라 선택적으로 로그를 남길 수도 있다.

로그를 기록할 장소를 지정하는 첫번째 아규먼트에는 다음 둘중 하나를 사용한다.

file
  `ServerRoot`에 상대적인 파일명.
pipe
  파이프문자 "`|`"뒤에 로그 정보를 표준입력으로 받을 프로그램 경로를 적는다.

  ### 보안:

  프로그램을 사용한다면 프로그램은 웹서버를 시작한 사용자 권한으로 실행된다. 서버를 root로 시작한다면 프로그램도 root로 실행하므로 프로그램이 안전한지 확인하라.

  ### 주의

  유닉스가 아닌 플래폼에서 파일경로를 입력할때 플래폼이 백슬래쉬를 사용하더라도 반드시 슬래쉬를 사용해야 한다. 일반적으로 설정파일에서는 항상 슬래쉬를 사용하는 것이 좋다.

두번째 아규먼트는 로그파일에 기록할 내용을 지정한다. 전에 `LogFormat`으로 정의한 nickname을 사용하거나 직접 로그 형식 절에서 설명한 format 문자열을 사용할 수 있다.

예를 들어, 다음 두 지시어는 똑같은 일을 한다.

`# 형식 별칭을 사용한 CustomLog
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
# 직접 형식 문자열을 사용한 CustomLog
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"`

세번째 아규먼트는 없어도 되며, 특정 서버 환경변수 유무에 따라 요청을 로그에 기록할지 여부를 결정한다. 요청에 지정한 환경변수가 정의되있다면 (혹은 '`env=!name`'를 사용한 경우 없다면) 요청을 로그에 기록한다.

`mod_setenvif`나 `mod_rewrite` 모듈을 사용하여 요청별로 환경변수를 설정할 수 있다. 예를 들어, 서버가 GIF 그림에 대한 모든 요청을 주서버 로그가 아닌 다른 로그파일에 기록하려면,

`SetEnvIf Request_URI \.gif$ gif-image
CustomLog gif-requests.log common env=gif-image
CustomLog nongif-requests.log common env=!gif-image`

## LogFormat 지시어

설명: | 로그파일에 사용할 형식을 기술한다
문법: | `LogFormat format|nickname [nickname]`
기본값: | `LogFormat "%h %l %u %t \"%r\" %>s %b"`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | mod_log_config

이 지시어는 접근 로그파일의 형식을 지정한다.

`LogFormat` 지시어는 두가지 형식으로 사용한다. 첫번째 형식은 아규먼트를 한개만 사용하여 다음 `TransferLog` 지시어들이 사용할 로그 형식을 지정한다. 이 아규먼트에 위의 로그 형식 지정하기 절에서 설명한 format을 직접 사용하거나, 다음에 설명할 `LogFormat` 지시어로 미리 정의한 (로그 형식을 지칭하는) nickname을 사용할 수 있다.

`LogFormat` 지시어의 두번째 형식은 format과 nickname을 연결한다. 그러면 뒤에서 사용하는 `LogFormat`이나 `CustomLog` 지시어에 반복해서 형식 문자열을 모두 입력하는 대신 nickname을 사용할 수 있다. 별칭을 정의하는 `LogFormat` 지시어는 이 외에는 아무 기능을 하지 않는다. 즉, 별칭만을 정의하며, 실제로 형식을 적용하거나 형식을 기본값으로 만들지 않는다. 그러므로 다음에 나오는 `TransferLog` 지시어에 영향을 주지 않는다. 또, `LogFormat`은 별칭으로 다른 별칭을 정의할 수 있다. 별칭 이름에는 퍼센트 기호(`%`)를 사용할 수 없음을 주의하라.

### 예제

`LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common`

## TransferLog 지시어

설명: | 로그파일 위치를 설정한다
문법: | `TransferLog file|pipe`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | mod_log_config

이 지시어는 `CustomLog` 지시어와 아규먼트와 기능이 비슷하지만, 로그 형식을 직접 지정하거나 요청을 조건에 따라 로그에 남길 수 없다. 대신 가장 최근 사용한 (별칭을 정의하지 않은) `LogFormat` 지시어가 지정한 로그 형식을 사용한다. 미리 형식을 지정하지 않았다면 Common Log Format을 사용한다.

### 예제

`LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog logs/access_log`

가능한 언어: en | ja | ko | tr

## Comments

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.