【问题标题】:Display Actual Method Name In Log在日志中显示实际方法名称
【发布时间】:2019-07-27 10:58:17
【问题描述】:

我一直在 .net 核心 webapi 项目中使用 Serilog,并且能够愉快地使用它。但是,我想在信息日志中包含方法名称的示例 - 可以使用 SourceContext 访问类名称。

但是,根据网上的各种建议/指南,我添加了一个浓缩器,但每次的结果都是实际的 Enrich 方法。

总结一下我的知识,我主要来自 .net 3.5 及以下的背景,因此目前所有超出此范围的内容都是非常陡峭的学习曲线。请温柔:-)

我都试过了:

logEvent.AddOrUpdateProperty(new LogEventProperty("MethodName", new ScalarValue(System.Reflection.MethodBase.GetCurrentMethod().Name))); 

logEvent.AddOrUpdateProperty(new LogEventProperty("MethodName", new ScalarValue(GetActualAsyncMethodName())));

【问题讨论】:

    标签: c# asp.net-core logging serilog


    【解决方案1】:

    最后我通过添加一个动作过滤器并为 Serilog 的 LogContext 添加一个属性来解决这个问题,如下所示:

        public class LoggingPropertiesFilter : IActionFilter
        {
            public void OnActionExecuting(ActionExecutingContext context)
            {
                // Do something before the action executes.
                ControllerBase controllerBase = context.Controller as ControllerBase;
                if(controllerBase != null)
                {
                    var routeAction = controllerBase.RouteData.Values["action"];
    
                    LogContext.PushProperty("method", routeAction);
    
                }
            }
    
            public void OnActionExecuted(ActionExecutedContext context)
            {
                // Do something after the action executes.
            }
        }
    

    到目前为止,我遇到的唯一问题是我必须手动为每个操作附加一个属性才能使其正常工作,但这确实解决了我最初遇到的问题,如果它对任何人都有用。

    【讨论】:

      【解决方案2】:

      尝试使用下面的代码:

      var methodname = ControllerContext.ActionDescriptor.ActionName;
      

      【讨论】:

      • 感谢 Xing Zou,但是,由于这是从 encricher 类中调用的,因此无法从此处访问 controllercontext。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2011-10-12
      相关资源
      最近更新 更多