'IHttpModule'에 해당되는 글 1건

  1. 2016.07.29 C# ASP.NET 자동으로 퍼포먼스 로그 남기기
개발팁2016. 7. 29. 10:01

IIS 웹서버로 요청되는 모든 웹페이지/웹서비스 요청에 대해, 퍼포먼스 로그를 남기는 방법이다.

 

퍼포먼스를 체크하는 방법은, 시작시간을 기록하고,

웹페이지나 특정 메서드가 실행되고 나서, 종료시간과의 차이를 계산해서 기록을 하면 된다.

 

DateTime _startTime = DateTime.Now;

 

// 웹페이지 / 메서드 실행.. 코드

 

TimeSpan span = DateTime.Now - _startTime;
string perfLog = span.Milliseconds.ToString() + " ms";


 

간단한 코드지만, 이를 매번 웹페이지마다 삽입하여 사용하는것은 어려우니,

HttpModule 을 이용하여, 자동으로 기록하는 방법이 있다.

 

IHttpModule 이라는 인터페이스를 이용하여, WebServiceAuthenticationModule 을 만들것이다.

이는 원래, 인증 체크를 위한 클래스인데, 이 안에, 퍼포먼스 로그 기능을 추가한 것이다.

 

별도의 프로젝트를 만들고, WebServiceAuthenticationModule  클래스를 만들어서,

Application_BeginRequest 와 Application_EndRequest 이벤트를 구현할 것이다.

이 프로젝트를 빌드해서, 별도의 DLL 을 만들면 된다.

 

ASP.NET 프로젝트에서 해당 DLL 을 참조 추가를 하고, Web.Config 에 아래와 같이 모듈을 추가 하면된다.

 

    <system.webServer>
      <!-- 인증체크 설정 -->
      <modules>
        <add  name="WebServiceAuthenticationModule"
              type="Hungry.Developer.HttpModule.WebServiceAuthenticationModule"/>
      </modules>
      ...

    </system.webServer>


 

이렇게 되면, 해당 ASP.NET  웹서비스의 모든 웹페이지는

항상 페이지 요청시, WebServiceAuthenticationModule 의 Application_BeginRequest 가 먼저 실행이 될것이고,

요청이 완료되면, Application_EndRequest 를 실행하게 될것이다.

 

이를 이용하여, 맨처음 보여줬던, 퍼포먼스 로그를 기록하면 된다.

 

// Copyright 헝그리개발자(https://bemeal2.tistory.com)
// 소스는 자유롭게 사용가능합니다. Copyright 는 삭제하지 마세요.
public sealed class WebServiceAuthenticationModule : IHttpModule
{
        private DateTime _startTime;    // 퍼포먼스 로깅을 위한 시작시간 저장 변수

        public void Init(HttpApplication app)
        {
            app.BeginRequest +=
                (new EventHandler(this.Application_BeginRequest));
            app.EndRequest +=
                (new EventHandler(this.Application_EndRequest));

        }
        private void Application_BeginRequest(object source, EventArgs e)
        {
             // 웹페이지 / 웹서비스 실행 시작시간 기록
            _startTime = DateTime.Now;

             // 인증체크
             ...
        }

        // 요청완료시, 퍼포먼스 로그 기록
        private void Application_EndRequest(object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;

            TimeSpan span = DateTime.Now - _startTime;
            string perfLog = application.Request.Url + " / " + span.Milliseconds.ToString() + " ms";
            LogWriter.PerfLog(perfLog);
        }

}

 

LogWriter 는 string 값을 파일에 추가하는 클래스다.

파일에 저장을 하던, DB에 저장을 하던, 원하는 방식으로 구현하면 된다.

 

아래는 위의 코드를 그대로 이용한, 실제 로그파일의 내용이다. 이중에 Performance 만 보면 된다.

 

2016-07-29 09:27:37.036 (Performance) From< HttpModule > :http://삐~/WebService/삐~Service.asmx / ReadBy / 100 ms
2016-07-29 09:27:37.359 (Debug) From< HttpModule > :인증체크 : 0 / cachekey(cUwze7r0rMTQCVHW9eXE/A==) / authkey(khMBxeLsajUjv7zdBcnrdG33JUQahNjqCqNzmH5G6nk=) / menuid(149) / permission(1)
2016-07-29 09:27:37.361 (Debug) From< HttpModule > :권한체크 : 0 / menuid(149) / permission(1) / requestURL(http://삐~/WebService/삐~Service.asmx) / webMethodName(ReadBy) / userIP(127.0.0.1)
2016-07-29 09:27:37.430 (Debug) From< HttpModule > :인증체크 : 0 / cachekey(cUwze7r0rMTQCVHW9eXE/A==) / authkey(khMBxeLsajUjv7zdBcnrdG33JUQahNjqCqNzmH5G6nk=) / menuid(149) / permission(1)
2016-07-29 09:27:37.433 (Debug) From< HttpModule > :권한체크 : 0 / menuid(149) / permission(1) / requestURL(http://삐~/WebService/삐~Service.asmx) / webMethodName(ReadBy) / userIP(127.0.0.1)
2016-07-29 09:27:37.470 (Performance) From< HttpModule > :http://삐~/WebService/삐~Service.asmx / ReadBy / 113 ms
2016-07-29 09:27:37.514 (Performance) From< HttpModule > :http://삐~/WebService/삐~Service.asmx / ReadBy / 87 ms
2016-07-29 09:27:46.580 (Debug) From< HttpModule > :인증체크 : 0 / cachekey(cUwze7r0rMTQCVHW9eXE/A==) / authkey(khMBxeLsajUjv7zdBcnrdG33JUQahNjqCqNzmH5G6nk=) / menuid(139) / permission(1)
2016-07-29 09:27:46.589 (Debug) From< HttpModule > :권한체크 : 0 / menuid(139) / permission(1) / requestURL(http://삐~/WebService/삐~Service.asmx) / webMethodName(삐~) / userIP(127.0.0.1)
2016-07-29 09:27:46.893 (Performance) From< HttpModule > :http://삐~/WebService/삐~Service.asmx / SponsorSearch / 315 ms 

 

Posted by 헝개