欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET 通过拦截器记录错误日志

程序员文章站 2022-11-01 18:38:25
前言 主要是记录一下实现的错误日志拦截,可以在拦截器里面控制返回的信息,把错误信息处理后返回给请求端。 代码实战 拦截器 /// /// 接口异常捕捉过滤器 /// [AttributeUsage(AttributeTargets.All, AllowMul ......

前言

    主要是记录一下实现的错误日志拦截,可以在拦截器里面控制返回的信息,把错误信息处理后返回给请求端。

代码实战

拦截器

    /// <summary>
    /// 接口异常捕捉过滤器
    /// </summary>
    [attributeusage(attributetargets.all, allowmultiple = false, inherited = true)]
    public class apierrorhandleattribute : exceptionfilterattribute
    {
        public override void onexception(httpactionexecutedcontext actionexecutedcontext)
        {
            base.onexception(actionexecutedcontext);
            actionexecutedcontext.response = getresponse(actionexecutedcontext);
        }

        /// <summary>
        /// 捕捉异常后响应方法
        /// </summary>
        private httpresponsemessage getresponse(httpactionexecutedcontext actionexecutedcontext)
        {
            var requesthost = actionexecutedcontext.actioncontext.request.requesturi.tostring();//当前请求的地址,包括ip加接口地址
            var method = actionexecutedcontext.actioncontext.request.method.tostring();//当前请求是post/get/put/delete ……
            var controller = actionexecutedcontext.actioncontext.actiondescriptor.controllerdescriptor.controllertype.fullname;//当前请求的控制器所在全路径:xxx.webapi.controllers.xxxcontroller
            var action = actionexecutedcontext.actioncontext.actiondescriptor.actionname; //当前请求的方法
            var paramters = actionexecutedcontext.actioncontext.actionarguments; //获取当前请求的参数
            var ip = httpcontext.current.request.userhostaddress;
           
            loghelper.error($"错误信息:url:{actionexecutedcontext.request.requesturi},--参数信息:{paramters.tojson()},--actionexecutedcontext.exception:{actionexecutedcontext.exception.tojson()}");
            var response = new { code = 506, message = $"{actionexecutedcontext.exception.message},url:{actionexecutedcontext.request.requesturi}", ex = actionexecutedcontext.exception };
           
            return jsonhelper.tohttpresponsemessage(response);
        }

    }

工具类方法

    public static class jsonhelper
    {
        /// <summary>
        /// 转化为json格式的httpresponsemessage
        /// </summary>
        public static httpresponsemessage tohttpresponsemessage(object obj)
        {
            string str;
            if (obj is string || obj is char)
            {
                str = obj.tostring();
            }
            else
            {
                str = obj.tojson();
            }
            var result = new httpresponsemessage { content = new stringcontent(str, encoding.getencoding("utf-8"), "application/json") };
            return result;
        }

        /// <summary>
        /// 转化为json字符串,默认的时间格式
        /// </summary>
        /// <param name="obj">要被转化的对象</param>
        /// <returns>json字符串</returns>
        public static string tojson(this object obj)
        {
            return jsonconvert.serializeobject(obj, new jsonserializersettings { referenceloophandling = referenceloophandling.ignore, dateformatstring = "yyyy-mm-dd hh:mm:ss" });
        }
    }