2011-04-13 42 views
4

我正在考慮企業日誌記錄服務的體系結構。它的工作是接收和存儲日誌消息,然後允許用戶訪問這些日誌消息。我們不需要將日誌記錄功能構建到現在可以使用它的現有Windows服務中,而是需要將其分開,以便其他服務可以在不久的將來使用它。我喜歡這樣一個事實,即我們的各種服務可以通過net.tcp記錄他們的消息,然後我可以構建一個RESTful接口,以便將特定的日誌消息傳遞給瀏覽器或其他任何東西。考慮使用WCF的記錄服務...請指教

  1. 使用WCF的日誌服務
  2. 使用的net.tcp的運輸
  3. 主機在Windows服務項目的服務:

    任何人都可以到智慧或缺乏下列選項說話(使用ServiceHost)

另外,我該如何設計它,以便它可以利用一些相當健壯的服務器來託管它?是否有可能打開多個連接(或自動完成)或實現一些自動多線程?

我們目前擁有的將使用這種日誌記錄服務的服務非常冗長,並且會非常頻繁地發送日誌消息(〜40-100k/day)。我還沒有建立一個原型並做了任何基準測試,我知道我沒有給你足夠的細節做出明確的決定,但我現在只是尋找一些方向和注意事項。謝謝。

+0

聽起來就像一個計劃 - 使用WCF,甚至可以從同一服務(不限於使用net.tcp)暴露多個端點(通過多個協議) – 2011-04-13 05:44:21

+1

原來WCF是一個很好的選擇!在從西雅圖到明尼阿波利斯的飛機上,我寫了一個WCF服務,完成了一個代碼優先的EF4數據層。這是非常優雅,比我預期的更高性能。我做了一個小客戶端發送每個相當大的日誌消息(比我們以前寫的任何日誌消息都大),每個日誌消息在0.005秒內寫入。非常刺激。 – 2011-04-20 03:19:03

回答

5

還有其他方法可以爲記錄創建一個更多的服務。您可以根據任何ServiceContractOperationContract的要求將日誌建立爲一個方面並附加/拆除此方面(又名注入)。通過這種方式可以將日誌記錄分離,但它避免了在每次調用時調用一個更多服務的開銷。一旦創建了這些方面,將它們編譯成單獨的二進制文件,並在需要時將它們用於所有未來的服務,啓用和禁用特定的日誌記錄方案與僅爲日誌記錄提供專用服務相比具有更好的可維護性。

看看下面的兩篇文章,他們提供了這樣簡單的方法,你必須填寫你想要的項目的肉體。

你想看看重要的MSDN文檔。

編輯 - 示例代碼

下面的代碼添加[OperationLogging]上述任何你的經營合同,並可以攔截來電此操作合同在LoggingInspector.BeforeCall

在任何服務合同上使用[ServiceLogging],並且可以攔截並記錄該服務調用中定義的所有操作。

your_app_config_key設置爲除TRUE之外的任何其他行爲都不會添加到您的服務管道中。這是非常酷的,因爲這些代碼都不是基於配置中的這個鍵來執行的。

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

偉大的想法。感謝您的時間和意見。 – 2011-04-20 03:29:17

+0

@JeremyFoster你可能想要接受最能回答你的問題的答案之一。 – 2011-10-04 23:00:08

1

原則上,我認爲單個審計服務是有意義的,只要它屬於您的應用程序的有限上下文範圍內。 IDesign有一個ES日誌示例實施here(查找「企業服務日誌」)。你可以做一些初步的測試,看它是否可以處理你所期望的負載。如果您擔心性能問題,我會考慮通過tcp進行消息排隊(示例日誌記錄應用程序也支持此功能)。至於託管,服務需要始終運行,所以Windows服務是有意義的。如果你想使用IIS,那麼我會建議使用Windows Server AppFabric並啓用應用程序的AutoStart功能。

HTH。

0

讀這個問題我有一些想法可以分享。 記錄本身並不是一項非常複雜的活動,使用WCF創建企業日誌記錄框架就沒有問題。但是隻記錄日誌的數據是沒有用的。然後這些數據需要被某些進程\ app使用,從而提供一些附加值。因此記錄的更重要的方面是

  • 什麼數據被記錄。
  • 如何記錄的數據被消耗\利用

所以我的建議是花更多的時間來考慮需要記錄什麼,這個數據增加了什麼價值。