HTTP API에서 오류 로깅

이 문서에서는 HTTP(HyperText Transfer Protocol) API(애플리케이션 프로그래밍 인터페이스)의 오류 로깅 기능에 대해 설명합니다.

원래 제품 버전: Windows Server 2008 R2, Windows Server 2008, Windows Server 2012 R2, Windows Server 2012, Windows 10, Windows 8.1
원본 KB 번호: 820729

요약

HTTP 기반 애플리케이션에서 발생하는 일부 오류는 처리를 위해 애플리케이션에 다시 전달되는 대신 HTTP API에서 자동으로 처리됩니다. 이 동작은 이러한 오류의 빈도가 이벤트 로그 또는 애플리케이션 처리기를 플러시할 수 있기 때문에 발생합니다.

다음 topics HTTP API 오류 로깅의 다양한 측면을 설명합니다.

  • HTTP API 오류 로깅 구성
    레지스트리 설정은 HTTP API 로그 오류, 허용되는 최대 로그 파일 크기 및 로그 파일의 위치를 제어합니다.

  • HTTP API 오류 로그의 형식
    HTTP API는 W3C(World Wide Web Consortium) 로그 파일 규칙을 따르는 로그 파일을 만듭니다. 표준 도구를 사용하여 이러한 로그 파일을 구문 분석할 수 있습니다. 그러나 W3C 로그 파일과 달리 HTTP API 로그 파일에는 열 이름이 포함되지 않습니다.

  • HTTP API에서 기록하는 오류 종류
    HTTP API는 많은 일반적인 오류를 기록합니다.

다음 메서드는 HTTP API 오류 로깅의 해결 방법을 설명합니다.

HTTP API 오류 로깅 구성

HTTP \Parameters 키 아래의 3개 레지스트리 값은 HTTP API 오류 로깅을 제어합니다. 이러한 키는 레지스트리 키 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters에 있습니다.

참고

구성 값의 위치 및 형식은 이후 버전의 Windows 운영 체제에서 변경 될 수 있습니다.

레지스트리 값을 변경하고 로그 파일과 해당 값이 포함된 폴더를 보거나 변경하려면 관리자/로컬 시스템 자격 증명이 있어야 합니다.

레지스트리 값의 구성 정보는 HTTP API 드라이버가 시작될 때 읽습니다. 따라서 설정을 변경하면 중지한 다음 드라이버를 다시 시작하여 새 값을 읽어야 합니다. 이렇게 하려면 다음 콘솔 명령을 입력합니다.

net stop http
net start http

다음 명명 규칙은 로그 파일의 이름을 지정하는 데 사용됩니다.
httperr + 시퀀스 번호 + .log
예: httperr4.log

로그 파일은 ErrorLogFileTruncateSize 레지스트리 값이 지정하는 최대 크기에 도달하면 순환됩니다. 이 값은 1MB(메가바이트) 미만일 수 없습니다.

오류 로깅 구성이 유효하지 않거나 HTTP API가 로그 파일에 쓰는 동안 오류가 발생하는 경우 HTTP API는 이벤트 로깅을 사용하여 관리자에게 오류 로깅이 발생하지 않음을 알립니다.

다음 표에서는 레지스트리 구성 값에 대해 설명합니다.

레지스트리 값 설명
EnableErrorLogging 오류 로깅을 사용하도록 설정하려면 TRUE로 설정하거나 FALSE로 설정하여 사용하지 않도록 설정할 수 있는 DWORD입니다. 기본값은 TRUE입니다.
ErrorLogFileTruncateSize 오류 로그 파일의 최대 크기를 바이트 단위로 지정하는 DWORD입니다. 기본값은 1MB(0x100000)입니다.

지정된 값은 기본값보다 작을 수 없습니다.
ErrorLoggingDir HTTP API가 로깅 파일을 배치하는 폴더를 지정하는 문자열입니다.

HTTP API는 지정된 폴더에 하위 폴더 HTTPERR을 만든 다음 하위 폴더에 로그 파일을 저장합니다. 이 하위 폴더와 로그 파일은 동일한 권한 설정을 받습니다. 관리자 및 로컬 시스템 계정에는 모든 권한이 있습니다. 다른 사용자에게는 액세스 권한이 없습니다.

다음 예제는 레지스트리에 폴더를 지정하지 않은 경우 기본 폴더입니다.
%SystemRoot%\System32\LogFiles

ErrorLoggingDir 문자열 값은 정규화된 로컬 경로여야 합니다. 그러나 를 포함 %SystemRoot%할 수 있습니다. 네트워크 드라이브 또는 네트워크 공유를 사용할 수 없습니다.

HTTP API 오류 로그의 형식

일반적으로 HTTP API 오류 로그 파일에는 열 머리글이 포함되지 않는다는 점을 제외하고 HTTP API 오류 로그 파일은 W3C 오류 로그와 동일한 형식을 갖습니다. HTTP API 오류 로그의 각 줄은 하나의 오류를 기록합니다. 필드는 특정 순서로 표시됩니다. 단일 공백 문자(0x0020)는 각 필드를 이전 필드와 구분합니다. 각 필드에서 더하기 기호(0x002B)는 공백 문자, 탭 및 인쇄할 수 없는 컨트롤 문자를 대체합니다.

다음 표에서는 오류 로그 레코드의 필드와 필드 순서를 식별합니다.

필드 설명
날짜 날짜 필드는 W3C 형식을 따릅니다. 이 필드는 UTC(협정 세계시)를 기반으로 합니다. 날짜 필드는 항상 YYYY-MM-DD 형식의 10자입니다. 예를 들어 2003년 5월 1일은 2003-05-01로 표시됩니다.
시간 시간 필드는 W3C 형식을 따릅니다. 이 필드는 UTC를 기반으로 합니다. 시간 필드는 항상 MM:HH:SS 형식의 8자입니다. 예를 들어 오후 5시 30분(UTC)은 17:30:00으로 표시됩니다.
IP(클라이언트 인터넷 프로토콜) 주소 영향을 받는 클라이언트의 IP 주소입니다. 이 필드의 값은 IPv4 주소 또는 IPv6 주소일 수 있습니다. 클라이언트 IP 주소가 IPv6 주소인 경우 ScopeId 필드도 주소에 포함됩니다.
클라이언트 포트 영향을 받는 클라이언트의 포트 번호입니다.
서버 IP 주소 영향을 받는 서버의 IP 주소입니다. 이 필드의 값은 IPv4 주소 또는 IPv6 주소일 수 있습니다. 서버 IP 주소가 IPv6 주소인 경우 ScopeId 필드도 주소에 포함됩니다.
서버 포트 영향을 받는 서버의 포트 번호입니다.
프로토콜 버전 사용 중인 프로토콜의 버전입니다.

프로토콜 버전을 확인하기 위해 연결이 충분히 구문 분석되지 않은 경우 하이픈(0x002D)이 빈 필드의 자리 표시자로 사용됩니다.

구문 분석된 주 버전 번호 또는 부 버전 번호가 10보다 크거나 같은 경우 버전은 HTTP/?.?.
동사 동사는 구문 분석된 마지막 요청을 말합니다. 알 수 없는 동사가 포함되어 있지만 255바이트 이상의 동사는 이 길이로 잘립니다. 동사를 사용할 수 없는 경우 하이픈(0x002D)이 빈 필드의 자리 표시자로 사용됩니다.
CookedURL + 쿼리 URL과 연결된 쿼리는 물음표(0x3F)로 구분된 하나의 필드로 기록됩니다. 이 필드는 길이 제한인 4,096바이트에서 잘립니다.

이 URL이 구문 분석("cooked")된 경우 로컬 코드 페이지 변환으로 기록되고 유니코드 필드로 처리됩니다.

이 URL이 로깅 시 구문 분석되지 않은 경우("cooked") 유니코드 변환 없이 정확하게 복사됩니다.

HTTP API가 이 URL을 구문 분석할 수 없는 경우 하이픈(0x002D)이 빈 필드의 자리 표시자로 사용됩니다.
프로토콜 상태 프로토콜 상태 999보다 클 수 없습니다.

요청에 대한 응답의 프로토콜 상태 사용할 수 있는 경우 이 필드에 기록됩니다.

프로토콜 상태 사용할 수 없는 경우 하이픈(0x002D)이 빈 필드의 자리 표시자로 사용됩니다.
SiteId 이 버전의 HTTP API에서는 사용되지 않습니다. 자리 표시자 하이픈(0x002D)은 항상 이 필드에 나타납니다.
이유 구문 이 필드에는 기록되는 오류의 종류를 식별하는 문자열이 포함되어 있습니다. 이 필드는 비어 있지 않습니다.
큐 이름 요청 큐 이름입니다.

다음 샘플 줄은 HTTP API 오류 로그에서 가져옵니다.

2002-07-05 18:45:09 172.31.77.6 2094 172.31.77.6 80 HTTP/1.1 GET /qos/1kbfile.txt 503 - ConnLimit  
2002-07-05 19:51:59 127.0.0.1 2780 127.0.0.1 80 HTTP/1.1 GET /ThisIsMyUrl.htm 400 - Hostname  
2002-07-05 19:53:00 127.0.0.1 2894 127.0.0.1 80 HTTP/2.0 GET / 505 - Version_N/S  
2002-07-05 20:06:01 172.31.77.6 64388 127.0.0.1 80 - - - - - Timer_MinBytesPerSecond

HTTP API에서 기록하는 오류 종류

HTTP API는 클라이언트, 연결 시간 제한, 분리된 요청 및 잘못 처리된 삭제된 연결에 대한 오류 응답을 기록합니다.

다음 목록에서는 HTTP API가 기록하는 오류 종류를 식별합니다.

  • 클라이언트에 대한 응답
    HTTP API는 클라이언트에 오류 응답을 보냅니다(예: 마지막으로 받은 요청의 구문 분석 오류로 인해 발생하는 400 오류). HTTP API가 오류 응답을 보낸 후 연결을 닫습니다.

  • 연결 시간 제한
    HTTP API는 연결을 시간 초과합니다. 연결 시간이 초과되면 요청이 보류 중인 경우 요청은 오류 로그의 연결에 대한 자세한 정보를 제공하는 데 사용됩니다.

  • 분리된 요청
    해당 프로세스로 라우팅되는 큐에 대기 중인 요청이 있는 동안 사용자 모드 프로세스가 예기치 않게 중지됩니다. HTTP API는 분리된 요청을 오류 로그에 기록합니다. 특정 오류 유형은 항상 각 오류 줄의 마지막 필드로 표시되는 Reason Phrase 문자열에 의해 명명됩니다. 다음 표에서는 HTTP API 이유 구를 식별합니다.

이유 구문 설명
AppOffline 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 애플리케이션 오류로 인해 애플리케이션이 오프라인 상태가 되었기 때문에 서비스를 사용할 수 없습니다.
AppPoolTimer 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 애플리케이션 풀 프로세스가 너무 바빠서 요청을 처리할 수 없기 때문에 서비스를 사용할 수 없습니다.
AppShutdown 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 관리자 정책에 대한 응답으로 애플리케이션이 자동으로 종료되므로 서비스를 사용할 수 없습니다.
BadRequest 요청을 처리하는 동안 구문 분석 오류가 발생했습니다.
Client_Reset 요청을 작업자 프로세스에 할당하기 전에 클라이언트와 서버 간의 연결이 닫혔습니다. 이 동작의 가장 일반적인 원인은 클라이언트가 서버에 대한 연결을 조기에 닫는 것입니다.
Connection_Abandoned_By_AppPool 애플리케이션 풀의 작업자 프로세스가 예기치 않게 종료되었거나 핸들을 닫아 보류 중인 요청을 분리했습니다.
Connection_Abandoned_By_ReqQueue 애플리케이션 풀의 작업자 프로세스가 예기치 않게 종료되었거나 핸들을 닫아 보류 중인 요청을 분리했습니다. Windows Vista 이상 버전 및 Windows Server 2008 이상 버전과 관련이 있습니다.
Connection_Dropped 서버가 최종 응답 패킷을 보내기 전에 클라이언트와 서버 간의 연결이 닫혔습니다. 이 동작의 가장 일반적인 원인은 클라이언트가 서버에 대한 연결을 조기에 닫는 것입니다.
Connection_Dropped_List_Full 클라이언트와 서버 간의 연결이 끊어지는 목록이 가득 찼습니다. Windows Vista 이상 버전 및 Windows Server 2008 이상 버전과 관련이 있습니다.
ConnLimit 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 사이트 수준 연결 제한에 도달했거나 초과했기 때문에 서비스를 사용할 수 없습니다.
Connections_Refused 커널 NonPagedPool 메모리가 20MB 미만으로 떨어졌고 http.sys 새 연결 수신이 중지되었습니다.
사용 안 함 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 관리자가 애플리케이션을 오프라인으로 전환했기 때문에 서비스를 사용할 수 없습니다.
EntityTooLarge 엔터티가 허용되는 최대 크기를 초과했습니다.
FieldLength 필드 길이 제한을 초과했습니다.
사용 권한 없음 구문 분석하는 동안 사용할 수 없는 요소 또는 시퀀스가 충족되었습니다.
머리글 헤더에서 구문 분석 오류가 발생했습니다.
Hostname(호스트 이름) 호스트 이름을 처리하는 동안 구문 분석 오류가 발생했습니다.
내부 내부 서버 오류가 발생했습니다(HTTP 오류 500).
Invalid_CR/LF 잘못된 캐리지 리턴 또는 줄 바꿈이 발생했습니다.
LengthRequired 필요한 길이 값이 없습니다.
해당 없음 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 내부 오류(예: 메모리 할당 오류 또는 URL 예약 목록 충돌)가 발생하여 서비스를 사용할 수 없습니다.
해당(N/I) 구현되지 않은 오류(HTTP 오류 501) 또는 알 수 없는 전송 인코딩으로 인해 서비스를 사용할 수 없는 오류(HTTP 오류 503)가 발생했습니다.
숫자 숫자를 처리하는 동안 구문 분석 오류가 발생했습니다.
전제 조건 필수 전제 조건이 누락되었습니다.
QueueFull 서비스를 사용할 수 없음 오류가 발생했습니다(HTTP 오류 503). 애플리케이션 요청 큐가 가득 차서 서비스를 사용할 수 없습니다.
RequestLength 요청 길이 제한을 초과했습니다.
Timer_AppPool 서버 애플리케이션이 큐를 제거하고 처리하기 위해 애플리케이션 풀 큐에서 요청이 너무 오래 대기했기 때문에 연결이 만료되었습니다. 이 시간 제한 기간은 ConnectionTimeout입니다. 기본적으로 이 값은 2분으로 설정됩니다.
Timer_ConnectionIdle 연결이 만료되어 유휴 상태로 유지됩니다. 기본 ConnectionTimeout 기간은 2분입니다.
Timer_EntityBody 요청 엔터티 본문이 도착하기 전에 연결이 만료되었습니다. 요청에 엔터티 본문이 명확하게 있는 경우 HTTP API는 Timer_EntityBody 타이머를 켭니다. 처음에는 이 타이머의 제한이 ConnectionTimeout 값(일반적으로 2분)으로 설정됩니다. 이 요청에 대해 다른 데이터 표시가 수신될 때마다 HTTP API는 타이머를 다시 설정하여 연결에 2분(또는 ConnectionTimeout에 지정된 모든 항목)을 제공합니다.
Timer_HeaderWait 요청에 대한 헤더 구문 분석이 기본 제한인 2분보다 더 많은 시간이 걸렸기 때문에 연결이 만료되었습니다.
Timer_MinBytesPerSecond 클라이언트가 적절한 속도로 응답을 받지 못했기 때문에 연결이 만료되었습니다. 응답 전송 속도가 기본값인 240바이트/초보다 느렸습니다. MinFileBytesPerSec 메타베이스 속성으로 제어할 수 있습니다.
Timer_ReqQueue 서버 애플리케이션이 큐를 해제하기 위해 애플리케이션 풀 큐에서 요청이 너무 오래 대기했기 때문에 연결이 만료되었습니다. 이 시간 제한 기간은 ConnectionTimeout입니다. 기본적으로 이 값은 2분으로 설정됩니다. Windows Vista 이상 버전 및 Windows Server 2008 이상 버전과 관련이 있습니다.
Timer_Response 예약. 현재 사용되지 않습니다.
Timer_SslRenegotiation
클라이언트와 서버 간의 SSL(Secure Sockets Layer) 재협상이 기본 제한 시간인 2분보다 오래 걸렸기 때문에 연결이 만료되었습니다.
URL URL을 처리하는 동안 구문 분석 오류가 발생했습니다.
URL_Length URL이 허용되는 최대 크기를 초과했습니다.
동사 동사를 처리하는 동안 구문 분석 오류가 발생했습니다.
Version_N/S 지원되지 않는 버전 오류가 발생했습니다(HTTP 오류 505).