【问题标题】:How to 'Logging' without adding a line to every method如何在不为每个方法添加一行的情况下“记录”
【发布时间】:2020-04-17 08:52:23
【问题描述】:

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

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 可以使用中间件。
  • 那些方法只是动作方法(控制器中定义的方法)吗?
  • 您真的想记录每个方法还是仅在发生错误/特定操作时记录?
  • @LeisenChang:有什么推荐吗?
  • @CodeNotFound: 是的,只有每个控制器内部的操作方法

标签: c# logging asp.net-web-api


【解决方案1】:

中间件是一种方法,或者您也可以创建一个过滤器,让您执行“之前”和“之后”操作,

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://docs.microsoft.com/en-us/archive/msdn-magazine/2014/february/aspect-oriented-programming-aspect-oriented-programming-with-the-realproxy-class

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

【讨论】:

    【解决方案2】:

    当您说“方法”时,我不确定您的意思是字面意义上的每种方法,还是只是每当控制器被击中时。但是中间件可能是要走的路。添加自定义中间件的文档在这里:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1 这是一个错误处理中间件的示例,您可以在其中放置日志:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多