wbc
2025-05-30 1167bba23716eeda7ad6342b8d6ca736adca16c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System.Diagnostics;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
 
namespace MESApplication.Filter;
 
/// <summary>
///     方法过滤器
/// </summary>
public class ActionFilter : IActionFilter
{
    private Stopwatch _stopwatch;
 
    /// <summary>
    ///     监控日志
    /// </summary>
    public static ILogger LoggerMonitor { get; set; }
 
    /// <summary>
    ///     错误日志
    /// </summary>
    public static ILogger LoggerError { get; set; }
 
 
    /// <summary>
    ///     方法执行前
    /// </summary>
    /// <param name="context"></param>
    /// <exception cref="NotImplementedException"></exception>
    public async void OnActionExecuting(ActionExecutingContext context)
    {
        // ErrorLog.Write("==================================================================================================================================");
        _stopwatch = new Stopwatch();
        _stopwatch.Start();
        //throw new NotImplementedException();
        if (LoggerMonitor != null)
        {
            //记录请求参数日志
            var desc = context.ActionDescriptor as ControllerActionDescriptor;
            if (desc != null)
            {
                var headers = new Dictionary<string, object>();
                var requestHeaders = context.HttpContext.Request.Headers;
 
                // 访问请求中的 header 信息
                foreach (var header in requestHeaders)
                    headers.Add(header.Key, header.Value);
                var requestHead = JsonConvert.SerializeObject(headers);
 
                var bodys = new Dictionary<string, object>();
                var actionArguments = context.ActionArguments;
                // 访问请求中的参数
                foreach (var argument in actionArguments)
                {
                    //dic.Add(argument.Key, argument.Value);
                    var parameter =
                        JsonConvert
                            .DeserializeObject<Dictionary<string, object>>(
                                argument.Value.ToString());
                    foreach (var item in parameter)
                        bodys.Add(item.Key, item.Value);
                }
 
                var requestBody = JsonConvert.SerializeObject(bodys);
 
                var logText = CreateRequestLogText(
                    context.HttpContext.Request.Method, desc.ControllerName,
                    desc.ActionName, requestHead, requestBody);
                //LoggerMonitor.LogDebug(logText);
                //ErrorLog.Write(logText);
            }
        }
    }
 
    public void OnActionExecuted(ActionExecutedContext context)
    {
        //throw new NotImplementedException();
        _stopwatch.Stop();
        var elaspsedMillisedconds = _stopwatch.ElapsedMilliseconds;
        var msg = "";
        //string msg = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 接口执行时间:{elaspsedMillisedconds}毫秒";
        //ErrorLog.Write(msg);
 
        if (context.Exception != null)
            // 记录异常日志
            if (LoggerError != null)
            {
                LoggerError.LogError(context.Exception,
                    context.Exception.Message);
 
                ErrorLog.Write(
                    $@"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 接口异常:{JsonConvert.SerializeObject(context.Exception)}");
                ErrorLog.Write(
                    $@"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 异常提示信息:{JsonConvert.SerializeObject(context.Exception.Message)}");
                ErrorLog.Write(
                    "==================================================================================================================================");
            }
 
        if (LoggerMonitor != null)
        {
            // 记录请求结果日志
            var desc = context.ActionDescriptor as ControllerActionDescriptor;
            if (desc != null)
            {
                var rst = context.Result as ObjectResult;
                var rstValue = rst != null ? rst.Value : null;
                var logText = CreateResponseLogText(
                    context.HttpContext.Request.Method,
                    desc.ControllerName,
                    desc.ActionName,
                    rstValue);
                LoggerMonitor.LogDebug(logText);
                ErrorLog.Write(logText);
            }
        }
        //  ErrorLog.Write(msg);
        //  ErrorLog.Write("==================================================================================================================================");
    }
 
    /// <summary>
    ///     创建请求日志文本
    /// </summary>
    /// <param name="method"></param>
    /// <param name="controllerName"></param>
    /// <param name="actionName"></param>
    /// <param name="actionArgs"></param>
    /// <returns></returns>
    private static string CreateRequestLogText(string method,
        string controllerName, string actionName, string requestHead,
        string requestBody)
    {
        var sb = new StringBuilder();
        sb.Append(
            $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 请求{method}/{controllerName}/{actionName}接口,请求Head:{requestHead}\n");
        sb.Append(
            $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 请求{method}/{controllerName}/{actionName}接口,请求Body:{requestBody}\n");
        return sb.ToString();
    }
 
    /// <summary>
    ///     创建响应日志文本
    /// </summary>
    /// <param name="method"></param>
    /// <param name="controllerName"></param>
    /// <param name="actionName"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    private static string CreateResponseLogText(string method,
        string controllerName, string actionName, object result)
    {
        var sb = new StringBuilder();
        sb.Append(
            $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} 完成请求{method}/{controllerName}/{actionName}接口,返回结果:");
        if (result != null)
            sb.Append($"{JsonConvert.SerializeObject(result)}");
        else
            sb.Append("无");
        return sb.ToString();
    }
}