AOP切面编程-ashx项目记录API日志

1、AOP入库方法

   可采用Application_BeginRequest或Application_EndRequest作为AOP入口,示例如下:

using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Net;
using System.IO;
using System.Drawing;
using System.Runtime.InteropServices.ComTypes;
using System.Diagnostics;
using System.Web;
using System.Collections.Specialized;
using System.Linq;

namespace BoZhon.TASAMO.MES.WebUI
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
        }

        protected void Application_End(object sender, EventArgs e)
        {
        }

        protected void Application_Error(object sender, EventArgs e)
        {
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
        }

        // 保存API日志
        protected void Application_EndRequest(object sender, EventArgs e)
        {
            // api_module
            //NameValueCollection customParams = new NameValueCollection();
            //customParams["api_tasknumber"] = Guid.NewGuid().ToString("N");  // 任务号
            //customParams["api_description"] = "查询委外工序信息_多工单外发采购查询";  // 接口说明
            //customParams["api_starttime"] = DateTime.Now.ToString();                  // 操作开始时间Str
            //customParams["api_operationnumber"] = "1";                                // 操作笔数Str
            //customParams["api_result"] = "Y";                                         // 操作结果
            //HttpContext.Current.Items["CustomParams"] = customParams;

            if (sender is HttpApplication httpApplication)
            {
                string url = httpApplication.Request.AppRelativeCurrentExecutionFilePath.ToString();
                if (!string.IsNullOrEmpty(url) && url.Length > 2)
                {
                    string apiTasknumberStr = string.Empty;       // 任务号
                    string apiDescriptionStr = string.Empty;      // 接口说明
                    string apiStarttimeStr = string.Empty;        // 操作开始时间Str
                    string apiOperationnumberStr = string.Empty;  // 操作笔数Str
                    string apiResultStr = string.Empty;           // 操作结果

                    if (HttpContext.Current.Items["CustomParams"] is NameValueCollection customParamsFromContext)
                    {
                        apiTasknumberStr = customParamsFromContext.AllKeys.Contains("api_tasknumber") ? customParamsFromContext["api_tasknumber"] : "1";                          // 任务号
                        apiDescriptionStr = customParamsFromContext.AllKeys.Contains("api_description") ? customParamsFromContext["api_description"] : string.Empty;              // 接口说明
                        apiStarttimeStr = customParamsFromContext.AllKeys.Contains("api_starttime") ? customParamsFromContext["api_starttime"] : string.Empty;                    // 操作开始时间Str
                        apiOperationnumberStr = customParamsFromContext.AllKeys.Contains("api_operationnumber") ? customParamsFromContext["api_operationnumber"] : string.Empty;  // 操作笔数Str
                        apiResultStr = customParamsFromContext.AllKeys.Contains("api_result") ? customParamsFromContext["api_result"] : string.Empty;                             // 操作结果
                    }

                    // 记录API访问日志
                    H_LOG_APIAccess h_LOG_APIAccess = new H_LOG_APIAccess();
                    h_LOG_APIAccess.Tasknumber = apiTasknumberStr;                                                                     // 任务号
                    h_LOG_APIAccess.Businessmodule = MES.Common.PageValidate.InputText(httpApplication.Request.Params["api_module"]);  // 业务模块
                    h_LOG_APIAccess.Interfacepath = httpApplication.Request.Url?.ToString();                                           // 接口路径 httpApplication.Request.Url.ToString();
                    if (h_LOG_APIAccess.Interfacepath.Length > 251)
                    {
                        h_LOG_APIAccess.Interfacepath = h_LOG_APIAccess.Interfacepath.Substring(0, 250);
                    }
                    h_LOG_APIAccess.Interfacedescription = apiDescriptionStr;                                                              // 接口说明
                    h_LOG_APIAccess.Starttime = string.IsNullOrEmpty(apiStarttimeStr) ? DateTime.Now : DateTime.Parse(apiStarttimeStr);    // 操作开始时间
                    h_LOG_APIAccess.Endtime = DateTime.Now;                                                                                // 操作结束时间
                    h_LOG_APIAccess.Result = apiResultStr;                                                                                 // 操作结果
                    h_LOG_APIAccess.Takeuptime = Convert.ToDecimal((h_LOG_APIAccess.Endtime - h_LOG_APIAccess.Starttime).TotalSeconds);    // 操作耗时
                    h_LOG_APIAccess.Operationnumber = string.IsNullOrEmpty(apiOperationnumberStr) ? 1 : int.Parse(apiOperationnumberStr);  // 操作笔数
                    h_LOG_APIAccess.Averagetime = h_LOG_APIAccess.Takeuptime / (int)h_LOG_APIAccess.Operationnumber;                       // 平均每笔耗时
                    h_LOG_APIAccess.Createdby = httpApplication.User?.Identity?.Name;                                                      // 操作人

                    APILogBLL.AddAPILog(h_LOG_APIAccess);  // 保存
                }
            }
        }

        protected void Session_Start(object sender, EventArgs e)
        {
        }

        protected void Session_End(object sender, EventArgs e)
        {
        }
    }
}

2、保存日志的参考方法

 /// <summary>
 /// 记录API日志
 /// </summary>
 public static void AddAPILog(H_LOG_APIAccess h_LOG_APIAccess)
 {
     try
     {
         Task.Run(() =>
         {
             StringBuilder sql = new StringBuilder();
             sql.Append("	INSERT ");
             sql.Append("	INTO H_LOG_APIACCESS( ");
             sql.Append("	    TASKNUMBER ");              // 任务号;目前存主键GUID
             sql.Append("	    , BUSINESSMODULE ");         // 业务模块
             sql.Append("	    , INTERFACEPATH ");          // 接口路径
             sql.Append("	    , INTERFACEDESCRIPTION ");   // 接口说明
             sql.Append("	    , STARTTIME ");              // 操作开始时间
             sql.Append("	    , ENDTIME ");                // 操作结束时间
             sql.Append("	    , \"RESULT\" ");             // 操作结果
             sql.Append("	    , TAKEUPTIME ");             // 操作耗时
             sql.Append("	    , OPERATIONNUMBER ");        // 操作笔数
             sql.Append("	    , AVERAGETIME ");            // 平均每笔耗时
             sql.Append("	    , CREATEDBY ");              // 操作人
             sql.Append("	) ");
             sql.Append("	VALUES ( ");
             sql.Append("	    :TASKNUMBER ");
             sql.Append("	    , :BUSINESSMODULE ");
             sql.Append("	    , :INTERFACEPATH ");
             sql.Append("	    , :INTERFACEDESCRIPTION ");
             sql.Append("	    , :STARTTIME ");
             sql.Append("	    , :ENDTIME ");
             sql.Append("	    , :RESULT1 ");
             sql.Append("	    , :TAKEUPTIME ");
             sql.Append("	    , :OPERATIONNUMBER ");
             sql.Append("	    , :AVERAGETIME ");
             sql.Append("	    , :CREATEDBY ");
             sql.Append("	)");

             List<OracleParameter> parameters = new List<OracleParameter>();
             parameters.Add(new OracleParameter() { ParameterName = ":TASKNUMBER", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Tasknumber });
             parameters.Add(new OracleParameter() { ParameterName = ":BUSINESSMODULE", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Businessmodule });
             parameters.Add(new OracleParameter() { ParameterName = ":INTERFACEPATH", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Interfacepath });
             parameters.Add(new OracleParameter() { ParameterName = ":INTERFACEDESCRIPTION", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Interfacedescription });
             parameters.Add(new OracleParameter() { ParameterName = ":STARTTIME", OracleDbType = OracleDbType.Date, Value = h_LOG_APIAccess.Starttime });
             parameters.Add(new OracleParameter() { ParameterName = ":ENDTIME", OracleDbType = OracleDbType.Date, Value = h_LOG_APIAccess.Endtime });
             parameters.Add(new OracleParameter() { ParameterName = ":RESULT1", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Result });
             parameters.Add(new OracleParameter() { ParameterName = ":TAKEUPTIME", OracleDbType = OracleDbType.Decimal, Value = h_LOG_APIAccess.Takeuptime });
             parameters.Add(new OracleParameter() { ParameterName = ":OPERATIONNUMBER", OracleDbType = OracleDbType.Decimal, Value = h_LOG_APIAccess.Operationnumber });
             parameters.Add(new OracleParameter() { ParameterName = ":AVERAGETIME", OracleDbType = OracleDbType.Decimal, Value = h_LOG_APIAccess.Averagetime });
             parameters.Add(new OracleParameter() { ParameterName = ":CREATEDBY", OracleDbType = OracleDbType.Varchar2, Value = h_LOG_APIAccess.Createdby });

             return DbHelper.ExecuteSql(sql.ToString(), parameters);
         });
     }
     catch (Exception ex)
     {
         string str = ex.StackTrace;

         loginfo.Info(DateTime.Now.ToString("yyyy-MM-dd:HH:mm:ss -> ") + "记录API日志失败!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message);
     }
 }

3、H_LOG_APIAccess类

using System;

namespace Model
{
    /// <summary>
    /// 日志_API访问日志
    /// </summary>
    //[SplitTable(SplitType.Week)]//按周分表 (自带分表支持 年、季、月、周、日)
    //[SugarTable("H_LOG_APIACCESS", "日志_API访问日志", false)]
    public class H_LOG_APIAccess
    {
        /// <summary>
        /// 任务号;目前存主键GUID
        /// </summary>
        //[SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true, ColumnName = "Tasknumber", ColumnDescription = "任务号")]
        public string Tasknumber { get; set; }

        /// <summary>
        /// 业务模块
        /// </summary>
        public string Businessmodule { get; set; }

        /// <summary>
        /// 接口路径
        /// </summary>
        public string Interfacepath { get; set; }

        /// <summary>
        /// 接口说明
        /// </summary>
        public string Interfacedescription { get; set; }

        /// <summary>
        /// 操作开始时间
        /// </summary>
        public DateTime Starttime { get; set; }

        /// <summary>
        /// 操作结束时间
        /// </summary>
        public DateTime Endtime { get; set; }

        /// <summary>
        /// 操作结果
        /// </summary>
        public string Result { get; set; }

        /// <summary>
        /// 操作耗时
        /// </summary>
        public decimal Takeuptime { get; set; }

        /// <summary>
        /// 操作笔数
        /// </summary>
        public float Operationnumber { get; set; }

        /// <summary>
        /// 平均每笔耗时
        /// </summary>
        public decimal Averagetime { get; set; }

        /// <summary>
        /// 操作人
        /// </summary>
        public string Createdby { get; set; }
    }
}

 

posted @   ꧁执笔小白꧂  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
历史上的今天:
2023-04-16 Linux系统知识(十一)-Ubuntu使用TCP/UDP并限制最大连接数
2023-04-16 ESP32开发教程(一)-VSCode安装Espressif IDF安装教程
2023-04-16 ESP32开发教程(目录)-目录
2023-04-16 Linux系统知识(目录)-目录
2023-04-16 Linux硬盘知识(三)-硬盘的扩容与缩减
2023-04-16 Linux硬盘知识(二)-移植系统
2023-04-16 Linux硬盘知识(一)-清理硬盘
点击右上角即可分享
微信分享提示