CustomEvents Ver 1.1.1

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (5/29/2007 4:46:33 PM) Viewing : 2461

이 어셈블리에 대한 이전 글 보기

아래 부분이 수정 되었다.

  /// <summary>

  /// MethodInvokeEvent V1.0

  /// 메서드를 호출한 로그를 남겨야 할 곳에 정의 하면 된다.

  /// </summary>

  /// <remarks>06.09.13 - ProtoType - 방실</remarks>

  /// <remarks>07.04.25 - parametersValue의 타입을 string[] 에서 object[]로 변경 - 방실</remarks>

  public sealed class MethodInvokeEvent : WebManagementEvent

  {

MethodInverEvents 는 앞에서 아주 간략하게 살펴 보았지만 
사용자의 액션을 로깅하기 위한 메서드이다.

앞에 글에서는 실무에서 써본적이 없다고 하였으나..이번 프로젝트에서 써보았다. ㅋ 
생각보다 괜찮게 OutPut 이 나온듯 하다.

    public int SaveBaseInfoForPositivity(string userName, int orderOrganCode, int objectOrderOrganCode, int? objectGatherOrganCode, string orderOrganOthers, string objectDocNo, DateTime objectGatherDate, bool isGroup, DateTime? birthDate, string birthPlace, string birthAddressCode, string birthAddressDetails, bool isPositivity, bool isEnterNet, int objectId, string detailObjectName, bool? isFromForeign, string incommingPath, string selectedPathogenicIds, string pcr, string rpla, string receiptOthers, out int enternetBaseId, out bool hasAntibioticTest)

    {

      int result = this.data.SaveBaseInfoForPositivity(userName, orderOrganCode, objectOrderOrganCode, objectGatherOrganCode, orderOrganOthers, objectDocNo, objectGatherDate, isGroup, birthDate, birthPlace, birthAddressCode, birthAddressDetails, isPositivity, isEnterNet, objectId, detailObjectName, isFromForeign, incommingPath, selectedPathogenicIds, pcr, rpla, receiptOthers, out enternetBaseId, out hasAntibioticTest);

 

      MethodInvokeEvent evt = new MethodInvokeEvent(userName, "시험송부입력", this, 100300, "SaveBaseInfoForPositivity", "Int32", new string[24] { "userName", "orderOrganCode", "objectOrderOrganCode", "objectGatherOrganCode", "orderOrganOthers", "objectDocNo", "objectGatherDate", "isGroup", "birthDate", "birthPlace", "birthAddressCode", "birthAddressDetails", "isPositivity", "isEnterNet", "objectId", "detailObjectName", "isFromForeign", "incommingPath", "selectedPathogenicIds", "pcr", "rpla", "receiptOthers", "enternetBaseId", "hasAntibioticTest" }, userName, orderOrganCode, objectOrderOrganCode, objectGatherOrganCode, orderOrganOthers, objectDocNo, objectGatherDate, isGroup, birthDate, birthPlace, birthAddressCode, birthAddressDetails, isPositivity, isEnterNet, objectId, detailObjectName, isFromForeign, incommingPath, selectedPathogenicIds, pcr, rpla, receiptOthers, enternetBaseId, hasAntibioticTest);

      evt.Raise();

 

      return result;

    }

위 예시는 좀 지저분해 보이지만 실제 써 먹었던 코드이다. 
기존의 string[] 보다는 object[]로 하는게 뭐랄까 보여 주고자 하는 정보에 유연성을 줄 수 있다고 판단되어 변경 하였다.

비즈니스계층에서 이런식으로 MethodInvokeEvent 개체를 생성하고 Raise()를 하게 되면 이벤트 로깅이 된다.
로깅이 된 결과는 아래와 같다.


사용자 지정 이벤트 정보:
######--------메서드 정보---------#####
Method Name : SaveBaseInfoForPositivity
Return Type : Int32
######--------파라메터 정보---------#####
userName : test0
orderOrganCode : 1281
objectOrderOrganCode : 1281
objectGatherOrganCode : null
orderOrganOthers : 기타기관1
objectDocNo : dd0705050
objectGatherDate : 2007-05-08 오전 12:00:00
isGroup : False
birthDate : null
birthPlace : null
birthAddressCode : 2623010300
birthAddressDetails : null
isPositivity : True
isEnterNet : True
objectId : 7
detailObjectName : null
isFromForeign : True
incommingPath : null
selectedPathogenicIds : 245
pcr : null
rpla : null
receiptOthers : null
enternetBaseId : 105490
hasAntibioticTest : False

이런식으로 로깅이 Web.config 에서 정의 한 방식대로 (메일이나 sqldb 나 이벤트로그) 저장이 되어 조회가 가능하다. 
어떤 사용자가 언제 어떤 인풋으로 어떤 액션을 했는지 로깅을 할 수 있다..


마지막 업데이트 : (5/29/2007 4:47:54 PM)

TAG : 없음



첨부 파일 보기 (1)
Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

Monitoring에서 사용되는 CustomEvents

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (1/16/2007 10:08:33 AM) Viewing : 3000
모니터를 한다는 것은 이렇게 생각을 해 볼 수가 있겠다.
어떠한 이벤트가 어떠한 방법으로 언제.. 일어나는가..를 생각해 보아야 할 터이다.
일단 어떠한 이벤트에 대한 부분이 바로 이 글의 주 내용이다.
어떠한 방법으로에 대한 내용은 다음 글에서 Provider에 대하여 얘기 하면서 할 계획이다.
마지막으로 언제에 대한 부분은..잠깐 설명을 하고 넘어가겠다.
쉽게 말해 언제 라는 것은 개발자의 의도대로 진행할 수도 있으며 기본 설정들을 따라 갈 수도 있다.
FCL에는 이미 수많은 이벤트들이 설계되어 있다. 이 이벤트들은 System.Web.Management네임스페이스에서 찾아보라.
개발자는 이를 적절하게 이용만 하면 되는 것이다.
상황 적절하게 Raise만 하게 된다면 이벤트를 모니터링 할 수 있게 된다.
Error 이벤트의 경우 앞서 살펴 보았던 모듈에서 이벤트를 일으켰던 것을 기억 하는가?

이제 설계된 이벤트에 대하여 알아 보도록 하겠다.
먼저 이 어셈블리에 있는 3개의 이벤트 클래스에 대하여 간략하게 설명을 해 보자면
CustomWebErrorEvent 의 경우는 앞서 설명했던 모듈에서 호출했던 바로 그.. 예외와 관련된 이벤트 클래스이며,
AuthenticationEvent 의 경우는 사용자가 인증하게 되면(즉 로그인 하게 되면 )발생되는 이벤트 클래스이며,
MethodInvokeEvent의 경우는 특정 메서드 호출을 모니터하기 위해 설계한 이벤트 클래스이다.

하나씩 호출 되는 시점을 비롯하여 간략하게 살펴 보겠다.

먼저 CustomWebErrorEvent 를 살펴 보자.

    public sealed class CustomWebErrorEvent : WebErrorEvent

다행이 WebErrorEvent라는 클래스가 이미 존재 하므로 이를 상속 받으면 간단하게 구현이 가능하다.
이 클래스의 목적은 예외가 발생 했을때 더 많은 클라이언트 및 서버정보를 가져오고자 하는 것이다.
기본 제공되는 메시지로는 어떠한 상황에서의 예외인지 알기가 힘들기 때문이다.

먼저 생성자를 보도록 한다.

    1 /// <summary>

    2 /// 사용자  아이디 추가

    3 /// </summary>

    4 /// <param name="userName">Name of the user.</param>

    5 /// <param name="message">The message.</param>

    6 /// <param name="eventSource">The event source.</param>

    7 /// <param name="eventCode">The event code.</param>

    8 /// <param name="exception">The exception.</param>

    9 public CustomWebErrorEvent(string userName, string message, object eventSource, int eventCode, Exception exception)

   10     : base(message, eventSource, eventCode, exception)

   11 {

   12     this.userName = (userName == null) ? "" : userName;

   13     this.except = exception;

   14 }

앞서 설명하였던 모듈에서 호출하는 생성자이다.
인증된 사용자라면 사용자의 이름을 남길 수가 있다.

    1 /// <summary>

    2 /// 이벤트 정보를 제공합니다.

    3 /// 커스텀으로 하기 위해서는 이 부분을 수정하면 됩니다.

    4 /// </summary>

    5 /// <param name="formatter">서식이 지정된 이벤트 정보가 들어 있는 <see cref="T:System.Web.Management.WebEventFormatter"></see>입니다.</param>

    6 public override void FormatCustomEventDetails(WebEventFormatter formatter)

    7 {

    8     if (formatter != null)

    9     {

   10         formatter.IndentationLevel += 1;

   11         formatter.AppendLine("######--------서버 변수---------#####");

   12         formatter.AppendLine(CopyCollection(this.request.ServerVariables));

   13         formatter.AppendLine("######--------폼 변수---------#####");

   14         formatter.AppendLine(CopyCollection(this.request.Form));

   15         formatter.AppendLine("######--------쿠키---------#####");

   16         formatter.AppendLine(CopyCollection(this.request.Cookies));

   17         formatter.AppendLine("######--------쿼리 스트링---------#####");

   18         formatter.AppendLine(CopyCollection(this.request.QueryString));

   19         formatter.IndentationLevel -= 1;

   20         formatter.AppendLine("");

   21     }

   22 }


이 메서드는 사실상 가장 중요한 메서드라고 볼수 있다.
사용자가 보게 되는 출력 메시지를 이 메서드에서 만들기 때문이다.
간단해 보이는데 사실 간단하다..ㅡ.ㅡ;
request 변수를 받아 ServerVariables와 Form과 Cookies와 QeuryString 컬렉션을 받아 그냥 뿌려 주는 코드이다.

그리고 마지막으로 Raise()를 한다.

/// <summary>

/// 이벤트를 발생합니다.

/// </summary>

public override void Raise()

{

    base.Raise();

}

간단해 보인다..^^;

이 이벤트의 호출은 앞서 글에서 설명했듯이 모듈에서 하니..그 글을 참조 하기 바란다.

이제 AuthenticationEvent 에 대해서 알아 보자.
이 역시 초 간단한 이벤트이다.
이 이벤트는 인증 하는 순간 호출 한다.
단순히 인증하는 사용자의 이름을 저장한다.
이 이벤트의 호출은 CustomLoginControl을 만들어 보자 글을 참고 하도록 한다.
이 클래스는 다음과 같이 선언된다.

    public sealed class AuthenticationEvent : WebAuthenticationSuccessAuditEvent

인증관련해서도 많은 클래스들이 정의되어 있다. 필요한 것을 골라 쓰면 되겠다.

/// <summary>

/// Initializes a new instance of the <see cref="AuthenticationEvent"/> class.

/// </summary>

/// <param name="message">The message.</param>

/// <param name="eventSource">The event source.</param>

/// <param name="eventCode">The event code.</param>

/// <param name="userName">Name of the user.</param>

public AuthenticationEvent(string message, object eventSource, int eventCode, string userName)

    : base(message, eventSource, eventCode, userName)

{

    this.userName = userName;

}

생성자를 보게 되면 특별한게 userName 밖에 없다.
이렇게 인스턴스를 생성한 후에
마찬가지로 Raise()하면 된다.

마지막으로 MethodInvokeEvent 라는 클래스인데. 이것은 특정 메서드를 호출 할때 그 이벤트의 로깅을 필요로 하는 곳에서 호출 하면 되겠다. 누가 어떤 작업을 했는지에 대한 로그를 남기기 위해서 만든것인데....아직 실무에서 써 보지는..@.@
생성자에서 메서드의 매개변수의 이름과 그 값을 전송 시키는건데..
솔직히..조금 억지 스러운 면이 없잖아 있어 보인다.
쉽게 로깅을 하기 위해서는 문자열로 표현이 가능한 타입이어야 하는데..
참으로 어디서 써먹을 수 있을지..아니면 변경 시켜야 할텐데..
소스 설명은 X팔리니 스킵하겠다.

다음은 이벤트에서 사용되는 Provider에 대해서 알아 보도록 하겠다.


마지막 업데이트 : (1/16/2007 10:09:16 AM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

Monitoring을 위한 Web.Config 설정

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (1/15/2007 4:55:07 PM) Viewing : 3106

MSDN에 모두 있는 내용이라 그냥 통과 할까 하다가..
맛배기만 보여 주기로..ㅡ.ㅡ;

    1     <healthMonitoring heartbeatInterval="0" enabled="true">

    2       <bufferModes>

    3         <clear/>

    4         <add name="Critical Notification" maxBufferSize="100" maxFlushSize="20" urgentFlushThreshold="1" regularFlushInterval="Infinite" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>

    5         <add name="Custom" maxBufferSize="100" maxFlushSize="5" urgentFlushThreshold="8" regularFlushInterval="00:10:00" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>

    6       </bufferModes>

    7       <eventMappings>

    8         <add name="CustomWebErrorEvent" type="BIT.Web.CustomEvents.CustomWebErrorEvent"/>

    9         <add name="AuthenticationEvent" type="BIT.Web.CustomEvents.AuthenticationEvent"/>

   10         <add name="MethodInvokeEvent" type="BIT.Web.CustomEvents.MethodInvokeEvent"/>

   11       </eventMappings>

   12       <profiles>

   13         <clear/>

   14         <add name="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00"/>

   15         <add name="Critical" minInstances="1" maxLimit="Infinite" minInterval="00:00:00"/>

   16       </profiles>

   17       <providers>

   18         <clear/>

   19         <!--add name="CustomSimpleMailWebEventProvider" type="BIT.Web.Monitoring.CustomSimpleMailWebEventProvider" from="admin@bit.co.kr" fromDisplayName="관리자" to="toskf072@bit.co.kr" priority="High" subjectPrefix="" bodyHeader="" bodyFooter=""/-->

   20         <add name="CustomEventLogWebEventProvider" type="BIT.Web.Monitoring.CustomEventLogWebEventProvider" log="Application" machineName="." source="Web Event" buffer="true" bufferMode="Critical Notification"/>

   21         <add name="CustomSqlWebEventProvider" type="BIT.Web.Monitoring.CustomSqlWebEventProvider" connectionStringName="con" buffer="true" bufferMode="Custom"/>

   22       </providers>

   23       <rules>

   24         <clear/>

   25         <add name="MethodInvoke" eventName="MethodInvokeEvent" provider="CustomSqlWebEventProvider" profile="Default"/>

   26         <add name="Error" eventName="CustomWebErrorEvent" provider="CustomSqlWebEventProvider" profile="Default"/>

   27         <add name="Authentication" eventName="AuthenticationEvent" provider="CustomSqlWebEventProvider" profile="Default"/>

   28       </rules>

   29     </healthMonitoring>

현재 이 사이트의 Web.Config 설정이다.

사용자가 만든 프로바이더 등의 설정들을 추가 하기 위해서는 반드시 원래 정의되어 있는 것과 충돌을 피하기 위하여 remove 혹은 clear를 호출해주어야 한다..
잊지 말기 바란다..꼭..

모니터링 관련 토픽의 내용을 이해 하기 위해서는 이 설정의 이해가 꼭..반드시 선행되어야 한다.
서두에 말했듯이 MSDN에서 보고..이해를 먼저..하도록 하고 이후 글을 읽도록 해야 ..머리가 편해진다..

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.ko/dv_ASPNETgenref/html/4290346b-a1c4-414a-b856-ad37d6985766.htm

왜냐..내가 설명을 잘 못하니깐..@.@


마지막 업데이트 : (1/25/2007 6:42:23 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

CustomWebErrorEventModule Ver 1.0

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (1/15/2007 4:31:33 PM) Viewing : 2730

이 모듈은 사이트상의 모든 예외 상황을 잡아 내기 위해 만든 것이다.
사이트상의 오류를 잡아 내는 방법은 다양하다.

Page에도 Global.asax에도 이벤트는 존재 한다.

그러나 나는 이 모듈을 사용한다..

사용법은 너무나 간단하다.

    public sealed class CustomWebErrorEventModule : IHttpModule

먼저 위처럼 HttpModule을 만들기 위해서는 IHttpModule 인터페이스를 상속 받아야 한다.
모듈에 대한 기본적인 설명은 다 알거라 생각하기에(???) 생략한다..ㅡ.ㅡ;

    1 #region IHttpModule 멤버

    2 

    3 /// <summary>

    4 /// Inits the specified app.

    5 /// </summary>

    6 /// <param name="app">The app.</param>

    7 public void Init(HttpApplication app)

    8 {

    9     if (app != null)

   10     {

   11         app.Error += OnError;

   12     }

   13 }

   14 

   15 /// <summary>

   16 ///    <see cref="T:System.Web.IHttpModule"></see>을 구현하는 모듈에서 사용하는 리소스(메모리 제외)를 삭제합니다.

   17 /// </summary>

   18 public void Dispose() { }

   19 

   20 #endregion

이 인터페이스는 위의 2가지 메서드를 구현하여야 한다.

첫번째 Init 메서드를 보게 되면 Error이벤트에 델리게이트 메서드를 할당한다.

    1 /// <summary>

    2 /// 응용프로그램상의 예외를 캐치 합니다.

    3 /// </summary>

    4 /// <param name="sender">The sender.</param>

    5 /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>

    6 private void OnError(object sender, EventArgs e)

    7 {

    8     HttpApplication app = sender as HttpApplication;

    9     if (app != null)

   10     {

   11         HttpContext context = app.Context;

   12         HttpRequest request = context.Request;

   13 

   14         int customCode = WebEventCodes.WebExtendedBase + 100;

   15         CustomWebErrorEvent err = new CustomWebErrorEvent(context.User.Identity.Name, "Custom Web Error Event", this, customCode, app.Server.GetLastError().GetBaseException());

   16         err.Request = request;

   17         err.Raise();

   18     }

   19 }

위 메서드가 이 모듈에서 가장 중요한 유일의 코드이다..
관심을 가져야 하는 부분은 바로 15행~17행이다.
먼저 CustomWebErrorEvent 라는 개체를 생성하며 그 인스턴스의 생성자로 app.Server.GetLastError().GetBaseException() 예외 개체를 넘긴다.
그리고 Raise() 로 이벤트를 일으킨다.

물론 당연하겠지만..위 모듈로는 전혀..이해 할 수가 없을 것이다..
단지 사이트에 예외가 발생하면 CustomWebErrorEvent 라는 개체가 생성되며 Raise 한다는 것 정도만 알면 OK다.

이제 차근 차근 알아 보도록 하자..

참고로 모듈은..Web.Config에 아래와 같이 세팅해야 한다..

    1     <httpModules>

    2       <add name="Custom Web Events" type="BIT.Web.Module.CustomWebErrorEventModule"/>

    3     </httpModules>


마지막 업데이트 : (1/15/2007 4:31:33 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

Monitoring 개요

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (1/15/2007 4:16:58 PM) Viewing : 2340

모니터링이라는 것은 쉽게 말해서
Web 사이트상에서 일어 나는 이벤트를 캐치해서 관리 하는 것이다.

이 역시 ASP.NET 2.0에서 새로 생긴 부분이며..
나름대로 상당히..애먹었던 부분이기도 하다.

몇번의 리팩터링을 하긴 했는데 아직도 약간..조잡하다는 느낌이 있다.

모니터링은
현재 3개의 프로젝트로 구현되어 있으며
하나씩 하나씩 설명해 보도록 하겠다.

 

 


마지막 업데이트 : (1/15/2007 4:18:14 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기



<< < 1 > >>