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). |
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기