我正在考虑企业日志服务的体系结构。它的工作是接收和存储日志消息,然后允许用户访问这些日志消息。与其将日志功能构建到当前使用它的现有Windows服务中,我们还需要将其分离,以便其他服务可以在不久的将来使用它。我喜欢这样一个事实:我们的各种服务可以在net.tcp上记录它们的消息,然后我可以构建一个RESTful接口,用于将特定的日志消息传递到浏览器或其他任何地方。
有谁能说出以下选择的智慧或不足:
此外,我如何设计它,使它能够利用一些相当强大的服务器,将托管它?是否可以打开多个连接(或者是自动完成的)或实现一些自动多线程?
我们目前拥有的一项服务将使用此日志服务,它非常冗长,并且将非常频繁地发送日志消息(~40-100 k/天)。我还没有建立一个原型,并做了任何基准,我知道我没有给你足够的细节作出明确的决定,但我只是寻找一些方向和考虑在这一点。谢谢。
发布于 2011-04-13 05:57:05
除了创建多一个仅用于日志记录的服务之外,还有其他选择。您可以将日志作为一个方面构建,并在任何ServiceContract或OperationContract需要时附加/分离这个方面(也称为注入)。这样,您就可以解耦日志记录,但它避免了每次调用时再调用一个服务的开销。创建这些方面之后,将它们编译成单独的二进制文件,并根据需要在所有未来的服务中使用它们,启用和禁用特定的日志记录场景比拥有专门的日志记录服务更易于维护。
看看下面的两个帖子,它们提供了一个简单的方法来完成这个任务,你必须在你的项目中填写你想要的内容。
您想要查看的重要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){}
}发布于 2011-04-13 05:53:33
在原则上,我认为一个单独的审计服务是有意义的,只要它属于您的应用程序的有限上下文。IDesign有一个ES日志簿这里的示例实现(查找“”)。您可以做一些初步的测试,看看它是否能够处理您期望的负载。如果您担心性能问题,我会考虑通过tcp进行消息队列(样例日志应用程序也支持这一点)。至于主机,服务需要始终运行,所以是有意义的。如果您想使用IIS,那么我建议使用Windows并启用应用程序的AutoStart功能。
HTH。
发布于 2011-04-13 07:29:36
读了这个问题,我有一些想法要分享。日志本身并不是一个非常复杂的活动,使用WCF创建一个企业日志框架就可以了。但是仅仅为日志记录的数据是没有用的。然后,这些数据需要由某个进程\app来使用,从而提供一些增值。因此,日志记录更重要的方面是
因此,我的建议是花更多的时间思考需要记录的内容以及这些数据所增加的价值。
https://stackoverflow.com/questions/5644875
复制相似问题