본문 바로가기

.NET/C#

HTTP POST 데이테를 모듈로 만들어 로깅하는방법

출처: https://www.codeproject.com/Tips/1213108/HttpModule-for-logging-HTTP-POST-data-in-IIS-Log


소개

때때로 ASP.NET 응용 프로그램에서 향후 분석 (사건 관리, 통계 등)을 위해 HTTP POST 데이터를 기록해야 할 필요가 있습니다. IIS는 표준 로깅 기능을 사용하여 HTTP GET 매개 변수를 즉시 저장하지만이 팁은 HTTP POST 데이터를 저장하는 것에 관한 것입니다. 이는 다소 까다 롭습니다. 고급 로깅이라는 또 다른 기능이있어 IIS 로그에 모든 데이터를 저장할 수 있지만이 경우 기존 웹 응용 프로그램을 변경하지 않으려는 경우 수동으로 데이터를 게시해야합니다. 그리 유용하지는 않습니다.

배경

다행히도이 문제를 해결하는 데 사용할 수있는 두 가지 훌륭한 기능이 있습니다. 첫 번째는 ASP.NET에서 사용자가 제공 한 데이터를 서버에서 생성 된 표준 IIS 로그에 추가하도록 지시하는 Response.AppendToLog 입니다 (ASP.NET net 파이프 라인의 어느 지점에서나 호출 할 수 있음). 두 번째 는 기존 웹 애플리케이션을 변경하지 않고 트릭을 수행하는 데 사용할 수있는 HttpModule 입니다.

코드 사용

솔루션에 새로운 클래스 라이브러리를 만들고 구현 한 새로운 클래스를 추가하십시오 IHttpModule메소드 에있는 BeginRequest이벤트를 구독 Init하고 로그에 추가 할 데이터를 처리하십시오. 다음 예는 모든 POST요청에 대한 모든 데이터를 기록합니다 .

using System;
using System.Web;

namespace MySolution.HttpModules
{
    public class HttpPOSTLogger : IHttpModule
    {
        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        private void context_BeginRequest(object sender, EventArgs e)
        {
            if (sender != null && sender is HttpApplication)
            {
                var request = (sender as HttpApplication).Request;
                var response = (sender as HttpApplication).Response;

                if (request != null && response != null && request.HttpMethod.ToUpper() == "POST")
                {
                    var body = HttpUtility.UrlDecode(request.Form.ToString());
                    if (!string.IsNullOrWhiteSpace(body))
                        response.AppendToLog(body);
                }
            }
        }
    }
}

새로 생성 된 모듈을 응용 프로그램의 web.config 에 등록하는 것을 잊지 마십시오 .

IIS 통합 모델에는 system.WebServer 섹션을 사용하십시오.

<system.webServer>
    <modules>
      <add name="HttpPOSTLogger" 

      type="MySolution.HttpModules.HttpPOSTLogger, MySolution.HttpModules" />
    </modules>
</system.webServer>

IIS 클래식 모델에는 system.web 섹션을 사용하십시오.

<system.web>
    <httpModules>
        <add name="HttpPOSTLogger" 

        type="MySolution.HttpModules.HttpPOSTLogger, MySolution.HttpModules"/>
    </httpModules>
</system.web>

설정이 끝나면 응용 프로그램을 시작하고 몇 가지 POST작업을 수행하십시오 이제 IIS ( 기본적으로 c : \ inetput \ Logs 디렉토리)에서 생성 된 로그 파일 에는 POST-"기호 대신 데이터가 포함 됩니다 .

전에:

::1, -, 10/31/2017, 10:53:20, W3SVC1, machine-name, ::1, 5, 681, 662, 200, 0, POST, 
/MySolution/MyService.svc/MyMethod, -,

후:

::1, -, 10/31/2017, 10:53:20, W3SVC1, machine-name, ::1, 5, 681, 662, 200, 0, POST, 
/MySolution/MyService.svc/MyMethod, 
{"model":{"Platform":"Mobile","EntityID":"420003"}},

응용 분야

이 솔루션을 사용하면 POST모든 요청에 ​​대한 데이터를 저장하는 것이 디스크 저장 공간 측면에서 매우 비쌉니다. 여기서는 웹 서비스에 게시 된 매우 작은 JSON 데이터를 저장하는 데 관심이있었습니다.

노트

IIS 로깅이 아직 설정되지 않은 경우 Windows 기능 추가 / 제거 또는 서버 관리자에서 수동으로 추가 할 수 있습니다. 이렇게하면 IIS 콘솔은 다음과 같이 표시됩니다.

로그 출력 샘플은 "IIS"형식으로 제공되지만 "W3C"도 사용할 수 있습니다.