如何在不为每个方法添加行的情况下"记录"



我有一个C#web api项目,基本上每次调用方法时我都需要记录(即方法名称、传递的参数、结果、堆栈跟踪(如果发生错误(等(。

现在,我通过在每种方法中添加几行来做到这一点,这看起来很臃肿,有没有更有效的方法来实现这一点?

任何帮助都将不胜感激。

谢谢

中间件是一种方法,或者您也可以创建一个Filter,让您执行"之前"one_answers"之后"操作,

https://www.tutorialsteacher.com/webapi/web-api-filters

【来自上述链接的代码】

public class LogDemoAttribute : Attribute, IActionFilter
{
public LogDemoAttribute()
{
}
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
Trace.WriteLine(string.Format("Action Method {0} executing at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
var result = await continuation();

Trace.WriteLine(string.Format("Action Method {0} executed at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
return result;
}
public bool AllowMultiple
{
get { return true; }
}
} 

这确实允许您添加到全局过滤器(在这种情况下,您还可以使用中间件(,或者选择性地将其添加到某些端点,例如

[ApiController]
public class PeopleController : ControllerBase 
{ 
[LogDemo]
[HttpGet("demo/endpoint")] 
public IActionResult GetAll()
{
}
}

这样做的好处是,您可能希望向属性传递一些参数,以便执行特定于上下文的行为。

如果您想将日志记录添加到非控制器代码中,那么您可以将这种方法进一步应用于面向方面/装饰器模式。

https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/february/aspect-oriented-programming-aspect-oriented-programming-with-the-realproxy-class

我通常发现控制器级别的日志记录参数已经足够好了,像Application Insights这样的生成遥测数据的东西实际上是有用的信息。

当你说"方法"时,我不确定你是指每一个方法,还是只是指控制器被击中的时候。但中间件可能是一条可行之路。关于添加自定义中间件的文档如下:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1这里有一个错误处理中间件的例子,您可以在其中放置日志:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1

相关内容

最新更新