考虑使用WCF进行日志记录服务...请告知

时间:2011-04-13 05:40:47

标签: c# wcf logging

我正在考虑企业日志服务的架构。它的工作是接收和存储日志消息,然后允许用户访问这些日志消息。我们需要将它分开,以便其他服务可以在不久的将来使用它,而不是将日志记录功能构建到我们现在使用它的现有Windows服务中。我喜欢这样一个事实,即我们的各种服务可以通过net.tcp记录他们的消息,然后我可以构建一个RESTful接口,用于向浏览器或其他任何方式提供特定的日志消息。

任何人都可以说出以下选择的智慧或缺乏:

  1. 使用WCF进行日志记录服务
  2. 使用net.tcp进行传输
  3. 在Windows服务项目中托管服务(使用ServiceHost)
  4. 另外,我如何设计它以利用一些相当强大的服务器来托管它?是否可以打开多个连接(或自动完成)或实现一些自动多线程?

    我们目前拥有的将使用此日志记录服务的一项服务非常冗长,并且会非常频繁地发送日志消息(~40-100k /天)。我还没有建立原型并进行任何基准测试,我知道我没有给你足够的细节来做出明确的决定,但我只是在寻找一些方向和考虑因素。感谢。

3 个答案:

答案 0 :(得分:5)

还有其他替代方法可以仅为日志记录创建一个服务。您可以将日志记录构建为方面,并在任何ServiceContractOperationContract需要时附加/分离此方面(也称为注入)。这样您就可以解除日志记录,但它避免了在每次调用时再调用一个服务的开销。一旦创建了这些方面,就可以在单独的二进制文件中将它们编译出来并在需要时在所有未来的服务中使用它们,与拥有专门的日志记录服务相比,启用和禁用特定日志记录方案的IMO更易于维护。

看看以下两篇帖子,他们提供了简单的方法,你必须按照你想要的项目填写。

您想要查看的重要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){}
}

答案 1 :(得分:1)

原则上我认为单个审计服务是有意义的,只要它属于您的应用程序的有限上下文。 IDesign具有ES日志here的示例实现(查找“企业服务日志”)。您可以进行一些初步测试,看看它是否能够处理您期望的负载。如果您担心性能,我会考虑通过tcp进行消息排队(示例日志记录应用程序也支持此功能)。至于托管,服务需要始终运行,因此Windows服务是有意义的。如果你想使用IIS,那么我建议使用Windows Server AppFabric并启用应用程序的AutoStart功能。

HTH。

答案 2 :(得分:0)

阅读问题我有一些想法可以分享。 记录本身并不是一个非常复杂的活动,使用WCF创建企业日志框架会很好。但是仅记录日志记录的数据是没有用的。然后,某些进程\ app需要使用此数据,从而提供一些附加值。因此,日志记录的更重要方面是

  • 正在记录哪些数据。
  • 如何使用
  • 消耗数据

所以我的建议是花更多时间考虑需要记录的内容以及这些数据增加的价值。