2011-04-13 2 views
4

엔터프라이즈 로깅 서비스의 아키텍처를 고려하고 있습니다. 로그 메시지를 수신하고 저장 한 다음 해당 로그 메시지에 사용자가 액세스 할 수 있도록해야합니다. 기존의 Windows 서비스에 로깅 기능을 구축하는 대신, 다른 서비스가 가까운 장래에 사용할 수 있도록이 기능을 분리해야합니다. 저는 다양한 서비스가 net.tcp를 통해 메시지를 기록 할 수 있다는 점을 좋아합니다. 그런 다음 브라우저에 특정 로그 메시지를 전달하기위한 RESTful 인터페이스를 구축 할 수 있습니다.로깅 서비스에 WCF 사용 고려 ... 조언하십시오

  1. 사용 WCF
  2. 사용 net.tcp 전송
  3. 호스트 Windows 서비스 프로젝트에서 서비스에 대한 로깅 서비스 :

    사람은 지혜 또는 다음과 같은 선택의 부족으로 말할 수 (ServiceHost 사용)

또한 어떻게 호스팅 할 예정인 다소 가벼운 서버를 활용할 수 있도록 디자인 할 수 있습니까? 다중 연결을 열 수 있습니까 (또는 자동으로 수행됩니까?) 또는 자동 멀티 스레딩을 구현할 수 있습니까?

현재이 로깅 서비스를 사용하는 서비스는 매우 장황하며 로그 메시지를 매우 자주 (~ 40-100k/일) 보내 게됩니다. 아직 프로토 타입을 작성하지 않았고 벤치마킹을 완료하지 못했지만 최종 결정을 내리기에 충분한 세부 정보를 제공하지 않는다는 것을 알고 있습니다. 그러나 지금은 방향 및 고려 사항을 찾고 있습니다. 감사.

+0

WCF를 사용하면 같은 서비스 (net.tcp를 사용하는 것만이 아니라)에서 여러 끝점 (여러 프로토콜을 통해)을 노출 할 수도 있습니다. –

+1

WCF가 좋은 선택입니다! 시애틀에서 미네아폴리스까지의 비행기에서 나는 코드 우선 EF4 데이터 레이어가있는 WCF 서비스를 작성했습니다. 그것은 내가 기대했던 것보다 매우 우아하고 더 공연적입니다. 로그 메시지를 보내려는 작은 클라이언트를 만들었고 각각의 로그 메시지는 우리가 작성하는 로그 메시지보다 큽니다. 매우 흥미로운. –

답변

5

로깅 용으로 하나 이상의 서비스를 만드는 다른 방법이 있습니다. 애스펙트로 로깅을 구축하고 필요에 따라 언제든지 ServiceContract 또는 OperationContract으로이 애스펙트 (일명 인젝션)를 첨부/분리 할 수 ​​있습니다. 이렇게하면 로깅을 분리 할 수 ​​있지만 모든 호출에서 하나 더 많은 서비스를 호출하는 오버 헤드를 피할 수 있습니다. 이러한 측면을 작성하고 별도의 바이너리로 컴파일 한 후 나중에 필요할 때마다 필요할 때 사용할 수 있으므로 특정 로깅 시나리오를 활성화 및 비활성화하는 것은 단순한 로깅을위한 전용 서비스를 사용하는 것과 비교하여 훨씬 유지 보수가 간편합니다.

다음 두 개의 게시물을 살펴보고 간단한 방법으로이 작업을 수행하면 프로젝트에 원하는대로 육체를 작성해야합니다. Creating a logging Aspect 당신이보고 싶어

  • WCF Extensibility: Parameter Inspectors
  • 중요 MSDN 문서

    • .

      편집 IParameterInspector

    • IOperationBehavior
    • - 코드 아래의 샘플 코드

      당신이 당신의 작업 계약의 위 [OperationLogging]을 추가하고 호출을 가로 챌 수 있습니다 이 작업 계약은 LoggingInspector.BeforeCall입니다.

      서비스 계약에 [ServiceLogging]을 사용하면 해당 서비스 호출에 정의 된 모든 작업이 가로 채고 기록 될 수 있습니다.

      TRUE 이외의 것으로 설정하면 이러한 추가 동작이 서비스 파이프 라인에 추가되지 않습니다. 이 코드는 config의이 키를 기반으로 실행되지 않으므로 매우 멋지다.

      public class LoggingInspector : IParameterInspector 
      { 
          private string service; 
          public LoggingInspector(string serviceName){ service = serviceName;} 
          public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState){} 
          public object BeforeCall(string operationName, object[] inputs) 
          { 
           // your logging logic 
          } 
      } 
      
      //Operation Logging attribute - applied to operationcontracts. 
      [AttributeUsage(AttributeTargets.Method)] 
      public class OperationLoggingAttribute : Attribute, IOperationBehavior 
      { 
          public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters){} 
          public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation){} 
          public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) 
          { 
           if (ConfigurationManager.AppSettings["your_app_config_key"] == "TRUE") 
            dispatchOperation.ParameterInspectors.Add(new LoggingInspector(dispatchOperation.Parent.Type.Name)); 
          } 
          public void Validate(OperationDescription operationDescription){} 
      } 
      
      //Service Loggign attribute - applied to Service contract 
      [AttributeUsage(AttributeTargets.Class)] 
      public class ServiceLoggingAttribute : Attribute, IServiceBehavior 
      { 
          public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters){} 
          public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
          { 
           if (ConfigurationManager.AppSettings["your_app_config_key"] == "TRUE") 
            foreach (ServiceEndpoint endpoint in serviceDescription.Endpoints) 
             foreach (OperationDescription operation in endpoint.Contract.Operations) 
              operation.Behaviors.Add(new OperationLoggingAttribute()); 
      
          } 
          public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase){} 
      } 
      
    +0

    좋은 아이디어. 시간과 의견을 보내 주셔서 감사합니다. –

    +0

    @JeremyFoster 귀하는 귀하의 질문에 가장 잘 대답하는 대답 중 하나를 수락하실 수 있습니다. –

    1

    원칙적으로 단일 감사 서비스는 응용 프로그램의 제한된 컨텍스트에있는 경우에만 적합하다고 생각합니다. IDesign은 ES Logbook here의 샘플 구현을 가지고 있습니다 ("The Enterprise Services Logbook"을 찾으십시오). 예상되는 부하를 처리 할 수 ​​있는지 확인하기 위해 초기 테스트를 수행 할 수 있습니다. 성능에 대해 걱정이된다면 TCP를 통한 메시지 큐잉을 고려할 것입니다 (샘플 로깅 애플리케이션도이를 지원합니다). 호스팅의 경우 서비스가 항상 실행되어야하므로 Windows 서비스가 적합합니다. IIS를 사용하려면 Windows Server AppFabric을 사용하고 응용 프로그램의 자동 시작 기능을 사용할 것을 제안합니다.

    HTH.

    0

    질문 읽기 나는 공유 할 생각이 있습니다. 로깅 자체는 대단히 복잡한 작업이 아니며 WCF를 사용하여 엔터프라이즈 로깅 프레임 워크를 만드는 것이 좋습니다. 그러나 로깅을 위해 기록 된 데이터는 아무 쓸모가 없습니다. 이 데이터는 일부 프로세스 \ app에서 소비해야하므로 일부 값을 추가해야합니다. 따라서 로깅의 중요한 측면은 다음과 같습니다.

    • 어떤 데이터가 기록되고 있습니까?

    그래서 내 충고가 기록되어야하며,이 데이터가 추가 어떤 값을 어떻게 생각하고 더 많은 시간을 할애하는 것입니다 이용 기록 된 데이터가 소비되는 방식

  • \.