반응형

액세스 로그에 기록되는 액세스한 정보는 IP 주소로 기록된다. 기록되는 시점에 IP 주소를 호스트명으로 변환하고 기록하기 위한 설정(HostnameLookups)도 있지만, 이는 액세스할 때마다 DNS 참조가 발생하여 부하가 높아지기 때문에 일반적으로 로그에 기록된 후 호스트명으로 일괄 변환한다.

IP 주소를 호스트명으로 변환하여 다른 파일로 저장하는 유틸리티 프로그램이 Apache에서는 제공하고 있다. "{Apache 설치 디렉토리}/Apache24/bin" 디렉토리에 들어있는 "logresolve" 프로그램을 사용한다.

사용법은 다음과 같습니다.

logresolve < 대상-로그-파일

위 명령어를 실행하면 변환된 로그가 표준 출력에 표시된다. 이것을 다른 파일에 저장하는 경우에는 다음과 같이 실행한다.

logresolve < 대상-로그-파일 > 변환-로그-파일

그러면 실제로 해보도록 하자. 명령 프롬프트에서 "{Apache 설치 디렉토리}/Apache24/bin"로 이동한 다음과 같이 실행한다.

logresolve < ..\logs\access.log > ..\logs\resolve.log
C:\apache\Apache24\bin>logresolve < ..\logs\access.log > ..\logs\resolve.log

C:\apache\Apache24\bin>

그러면 로그 파일이 들어있는 디렉토리에 "resolve.log"파일이 새로 생성된. 텍스트 편집기에서 내용을 확인해 본다.

DESKTOP-XXXXXXX - - [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"
DESKTOP-XXXXXXX - - [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"
DESKTOP-XXXXXXX - - [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"
DESKTOP-XXXXXXX - - [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"
DESKTOP-XXXXXXX - - [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"
DESKTOP-XXXXXXX - - [06/Dec/2019:00:50:34 +0900] "-" 408 - "-" "-"

IP 주소를 호스트명으로 변환되어 저장되어 있다. (테스트 환경이기 때문에 127.0.0.1이DESKTOP-XXXXXXX으로 변환되고 있다.)

반응형
반응형

에러 로그는 어느 레벨까지의 에러를 기록할지 여부를 8단계로 지정할 수 있다. 지정하려면 "LogLevel"로 사용하여 설정한다.

LogLevel 기록하는-레벨

설정 가능한 레벨은 다음과 같다.

레벨의미
emerg서버가 가동 할 수 없을 정도의 심각한 오류
alertcrit보다 심각한 오류
crit치명적인 오류
error오류
warn경고
notice알림 메시지
info서버 정보
debug디버깅을위한 정보

레벨은 위에서 부터 심각하고, "error"로 설정하면 "error" 위의 "crit", "alert", "emerg" 에러도 모두 기록된다.

보다 낮은 수준으로 설정하면 많은 정보를 로그로 남길 수 있지만, 그 만큼 로그 파일 크기가 커지게 되므로 필요에 따라 설정을 변경한다.

"httpd.conf" 파일에 대한 "LogLevel"로 검색해 보면, 다음과 같은 내용을 찾을 수 있을 것이다.

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

기본으로 LogLevel가 "warn"으로 설정되어 있다. 변경하려면 "warn"부분을 다른 수준의 값으로 변경하면 된다.

반응형
반응형

액세스 로그은 오직 1개의 파일에만 저장되는 것은 아니다. 로그 형식을 여러개를 정의하여 별도의 액세스 로그로 여러 파일에 저장할 수도 있다.

기본적으로 "httpd.conf" 파일에 작성되어 있는 로그 포맷에 "User-Agent"만 따로 기록하는 형식을 추가한다.

LogFormat "%{User-Agent}i" agent

그리고, 로그 파일 지정에서 새로운 "CustomLog"를 지정한다.

CustomLog logs/agent.log agent

실제 적용이 된다면 아래와 같을 것이다.

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{User-Agent}i" agent <--------------------------- 여기 추가하였다.

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # 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/agent.log agent <--------------------------- 여기 추가하였다.
        
</IfModule>

이것으로 "User-Agent"만 다른 액세스 로그 파일 "agent.log"에 기록되게 되었다.

그러면 "httpd.conf" 파일을 편집한 후에 Apache를 재시작한 후 Apache에 적당히 액세스 로그를 확인해 본다.

기존 액세스 로그를 기록했던 "access.log" 파일과는 별도로 새롭게 "agent.log"라는 파일이 새로 생성되고, 파일에 액세스한 브라우저에 대한 정보만 기재되어 있는 것을 확인할 수 있다.

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363

위 로그는 "Internet Explorer", "Edge", "Chrome" 3개의 브라우저에서 각각 Apache에서 공개되는 HTML 파일을 열람한 경우이다.

반응형
반응형

액세스 로그로 저장하는 데이터는 직접 커스텀마이징하여 형식을 지정할 수 있다.

로그 형식 : 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요청에 대한 가상 호스트 이름
%VUseCanonicalName 따른 서버명.
%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"

위 내용이 새로운 포맷으로 기록된 로그이다. 더 자세한 정보가 기록이 된 것을 볼 수 있다.

반응형
반응형

액세스 및 오류 로그의 위치는 "httpd.conf"에 정의되어 있다. 먼저 액세스 로그에서 살펴 보겠다.

액세스 로그 : CustomLog

액세스 로그 파일의 위치는 "CustomLog"로 지정한다. "httpd.conf"에서 "CustomLog"로 검색해 보면, 다음과 같은 내용을 찾을 수 있을 것이다.

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # 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
</IfModule>

액세스 로그 파일을 지정하는 "CustomLog" 형식은 다음과 같다.

CustomLog 로그-파일-위치 로그-형식-이름

로그 파일 위치는 "ServerRoot"의 위치에서 상대 위치로 지정한다. ServerRoot에 대해서는 "서버 위치 디렉토리 (ServerRoot)"를 참조한다.

로그 형식 이름은 "LogFormat"으로 정의된 어떤 로그를 기록할 것에 대한 정의를 지정한 것이다. "LogFormat"의 맨 뒤에 작성되어 있는 문장이 포멧명이 된다. 포멧 내용에 대한 자세한 내용은 다른 페이지에서 설명하겠다.

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

따라서 첫번째 줄의 LogFormat 이름은 "combined"이고, 두번째 줄의 LogFormat 이름은 "common"이다.

기본적으로 활성화되어 있는 액세스 로그는다음과 같이 정의되어 있다.

 CustomLog "logs/access.log" common

이 설정은 로그 파일명은 "access.log"이고, 로그 포멧은 "common"으로 되어 있다.

에러 로그 : ErrorLog

에러 로그 파일의 위치는 "ErrorLog"로 지정한다. "httpd.conf"에서 "ErrorLog"로 검색해 보면, 다음과 같은 내용을 찾을 수 있을 것이다.

#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog "logs/error.log"

에러 로그 파일의 위치도 "ServerRoot"의 위치에서 상대 위치로 지정된다.

로그 파일 확인

액세스 로그와 에러 로그를 텍스트 파일로 되어 있어 텍스트 편집기에서 열어 볼 수 있다.

C:\apache\Apache24\logs>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\apache\Apache24\logs 디렉터리

2019-12-05  오후 11:29    <DIR>          .
2019-12-05  오후 11:29    <DIR>          ..
2019-12-05  오후 11:25            17,108 access.log
2019-12-05  오후 11:29            60,733 error.log
2019-12-05  오후 11:29                 7 httpd.pid
2019-08-09  오후 11:50             3,146 install.log
               4개 파일              80,994 바이트
               2개 디렉터리  450,580,013,056 바이트 남음

C:\apache\Apache24\logs>

access.log

127.0.0.1 - - [03/Dec/2019:01:21:23 +0900] "GET /referer.html HTTP/1.1" 304 -
127.0.0.1 - - [03/Dec/2019:01:21:23 +0900] "GET /img/devkuma.jpg HTTP/1.1" 403 199
::1 - - [03/Dec/2019:01:21:32 +0900] "GET /referer.html HTTP/1.1" 304 -
::1 - - [03/Dec/2019:01:21:32 +0900] "GET /img/devkuma.jpg HTTP/1.1" 304 -
127.0.0.1 - - [03/Dec/2019:01:21:51 +0900] "GET /img/devkuma.jpg HTTP/1.1" 200 5168
::1 - - [03/Dec/2019:01:22:43 +0900] "-" 408 -
::1 - - [03/Dec/2019:01:22:43 +0900] "-" 408 -
127.0.0.1 - - [03/Dec/2019:01:22:51 +0900] "-" 408 -
127.0.0.1 - - [03/Dec/2019:01:53:07 +0900] "GET /admin/admin.page HTTP/1.1" 401 381
127.0.0.1 - - [03/Dec/2019:01:53:34 +0900] "GET /admin/admin.html HTTP/1.1" 401 381
127.0.0.1 - - [03/Dec/2019:01:54:12 +0900] "GET / HTTP/1.1" 200 99

error.log

[Thu Dec 05 23:27:14.834393 2019] [mpm_winnt:notice] [pid 5788:tid 580] AH00364: Child: All worker threads have exited.
[Thu Dec 05 23:27:14.852887 2019] [mpm_winnt:notice] [pid 11848:tid 576] AH00430: Parent: Child process 5788 exited successfully.
[Thu Dec 05 23:29:01.662578 2019] [mpm_winnt:notice] [pid 10168:tid 668] AH00455: Apache/2.4.41 (Win64) PHP/7.4.0 configured -- resuming normal operations
[Thu Dec 05 23:29:01.662578 2019] [mpm_winnt:notice] [pid 10168:tid 668] AH00456: Apache Lounge VS16 Server built: Aug  9 2019 16:46:32
[Thu Dec 05 23:29:01.662578 2019] [core:notice] [pid 10168:tid 668] AH00094: Command line: 'httpd.exe -d C:/apache/Apache24'
[Thu Dec 05 23:29:01.665949 2019] [mpm_winnt:notice] [pid 10168:tid 668] AH00418: Parent: Created child process 7372
[Thu Dec 05 23:29:02.063030 2019] [mpm_winnt:notice] [pid 7372:tid 664] AH00354: Child: Starting 64 worker threads.

기록되는 포맷의 세부 사항 및 에러 로그에 기록되는 에러 레벨 설정 등에 대해서는 다음 페이지에서 설명하도록 하겠다.

반응형

+ Recent posts