Apache HTTP Server Version 2.4

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

# 아파치 모듈 mod_log_config

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

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

### 요약

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

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

### 주제

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

### 지시어들

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

### 참고

- 아파치 로그파일

## 로그 형식 지정하기

`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
문법: | ``
사용장소: | 주서버설정
상태: | Base
모듈: | mod_log_config

Documentation not yet translated. Please see English version of document.

## 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`

## GlobalLog 지시어

설명: | Sets filename and format of log file
문법: | `GlobalLogfile|pipe format|nickname [env=[!]environment-variable| expr=expression]`
사용장소: | 주서버설정
상태: | Base
모듈: | mod_log_config
지원: | Available in Apache HTTP Server 2.4.19 and later

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

## 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`