【问题标题】:How to log each method Execution time and parameters on .Net Web Api如何在 .Net Web Api 上记录每个方法的执行时间和参数
【发布时间】:2019-10-31 12:40:38
【问题描述】:

我们有时会在 Web 应用程序(.NET Web Api2)上遇到性能问题,每次用户报告性能问题时,我们都需要调试应用程序以了解发生了什么以及哪种方法需要更多时间。

是否有最好的方法通过记录所有方法调用(包括时间和它的按需参数)来处理这个问题,这样当它很慢时我们可以启用它并获取日志来查看而不是调试应用程序。

这不仅仅是控制器方法,我喜欢记录调用中的所有方法。

感谢任何与此相关的 cmets 或良好示例。

【问题讨论】:

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


    【解决方案1】:

    NLog 可以提供这个功能。

    请参阅 NLog Tutorial 进行安装和设置。

    是否有最好的方法来记录所有方法调用,包括按需记录时间及其参数

    您需要创建一个操作过滤器,它将提供请求所花费的时间。

    ActionFilter:(您可能需要根据您的要求更改代码)

       public class LogHttpRequestAttribute : ActionFilterAttribute
       {
        private static Logger _logger = LogManager.GetCurrentClassLogger();
    
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
           _logger.Info("action execution started");
        }
    
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            _logger.Info("action execution finished");
       }
    

    Global.asax:

    protected void Application_Start()
    {
        //Some code.
    
        // Register global filter
        GlobalFilters.Filters.Add(new LogHttpRequestAttribute());
    }
    

    您必须在 NLog.config 文件中为此过滤器添加一个目标。

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>
    <rules>
        <logger name="*.LogHttpRequestAttribute" writeTo="logfile" />
    </rules>
    

    上面给出的例子还远未完成,但我希望它能指引你正确的方向。

    here 提供了许多有用的布局渲染器,请查找 Web、ASP.NET 和 ASP.NET Core 部分。 很少有用的是

    • ${aspnet-mvc-action}
    • ${aspnet-mvc-controller}
    • ${aspnet-request-form}
    • ${aspnet-request-querystring}
    • ${aspnet-user-identity}

    启用日志记录并获取日志以查看而不是调试应用程序。

    要禁用日志记录,请将 ruleenabled 属性设置为 false 或 disable in code

    不仅是控制器方法,我喜欢记录调用中的所有方法。

    您必须在每个要记录的类中为此创建一个静态变量。

    private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
    

    然后使用此成员记录数据。

    _logger.Info("data");
    

    编辑:从任何方法登录。

    using NLog;
    public class DemoClass
    {
        private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
    
        public void DemoMethod()
        {
            try
            {
                //some code
                _logger.Info("Some information");
            }
            catch (Exception ex)
            {
                _logger.Error(ex, $"Something went wrong");
                throw;
            }
        }
    }
    

    【讨论】:

    • 感谢 Vaishnav,我喜欢记录其他方法,不仅是控制器操作方法..
    • 正如我在答案中提到的,您可以从任何班级登录。您所需要的只是 Logger 实例。在你的类中创建 _logger 成员并记录来自任何方法的消息 _logger.Info("message");
    • @Max_dev 我已经修改了答案
    【解决方案2】:

    您可以通过公开指标端点并使用仪表板来可视化指标来监控应用程序的性能。 一种非常流行的方法是使用App-Metrics 库以及PrometheusGrafana 来公开指标

    https://www.app-metrics.io/web-monitoring/aspnet-core/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      相关资源
      最近更新 更多