将日志记录(到数据库)添加到服务堆栈服务

时间:2013-12-30 15:57:00

标签: logging servicestack

我是Service Stack的新手,并创建了我的第一个服务来替换WebAPI服务。该服务将是只读的,并且主要用于JsonServiceClient。我正在使用Service Stack的第4版。

我需要将每个请求的几个内容记录到数据库中 - 请求变量(HTTP_USER_AGENTLOGON_USER等),响应代码,响应内容类型,响应时间(ms ),返回的记录数(如果适用)等。

我正在寻找实现这一目标的“全局”方式(不需要在每个服务/方法中添加大量代码)。

以前有人做过这种日志记录吗?

2 个答案:

答案 0 :(得分:4)

执行此操作的最佳方法是使用GlobalRequestFilterGlobalResponseFilter,您可以在AppHost Configure方法中设置public override void Configure(Funq.Container container) { ... // Record the time the request started. this.GlobalRequestFilters.Add((req, res, requestDto) => req.SetItem("StartTime", DateTime.Now)); // The request has been processed, ready to send response this.GlobalResponseFilters.Add((req, res, responseDto) => { // Get the start time that was recorded when the request started var startTime = req.GetItem("StartTime") as DateTime; // Determine the duration of the request var duration = DateTime.Now - startTime; // You can use req.Headers to access things like the HTTP_USER_AGENT // If you are returning a IList of results then you can determine // the number of records you are returning from the responseDto var list = responseDTO as IList; if(list != null){ // Response is a list // Record the count using list.count } /* * Passing additional information: * If you need to make information from within your service methods available * here then you can use Request.SetItem() and access it here using req.GetItem() */ // Save the log to the database }); } 和{{1}}。有关过滤请求的详细信息,请See here

下面的代码显示了基本结构,您可以获得有关请求和响应的所有数据。

{{1}}

我希望这是一个很好的起点。

答案 1 :(得分:2)

我会查看ServiceStack中内置的RequestLogsFeature。默认情况下,它会将请求的滚动列表保存在内存中;但是,您可以创建自己的IRequestLogger实现,该实现将保存到数据库中。您可以通过添加如下功能轻松实现它:

Plugins.Add(new RequestLogsFeature { RequiredRoles = new string[] { } });

RequestLogsFeature提供了一项简单的服务,可以在/ requestlogs中显示您服务的最后N项;但是,如果您只想将信息保存到数据库,可以通过手动注册自己的请求记录器来跳过此步骤。

in your Service Hosts's Configure method:
Register<IRequestLogger>(new MyRequestLogger());