我是Service Stack的新手,并创建了我的第一个服务来替换WebAPI服务。该服务将是只读的,并且主要用于JsonServiceClient
。我正在使用Service Stack的第4版。
我需要将每个请求的几个内容记录到数据库中 - 请求变量(HTTP_USER_AGENT
,LOGON_USER
等),响应代码,响应内容类型,响应时间(ms ),返回的记录数(如果适用)等。
我正在寻找实现这一目标的“全局”方式(不需要在每个服务/方法中添加大量代码)。
以前有人做过这种日志记录吗?
答案 0 :(得分:4)
执行此操作的最佳方法是使用GlobalRequestFilter
和GlobalResponseFilter
,您可以在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());