环境:net core 5.0
public class LogAttribute : ActionFilterAttribute {
private string LogFlag { get; set; }
private string ActionArguments { get; set; }
/// <summary>
/// 请求体中的全部值
/// </summary>
private string RequestBody { get; set; }
private Stopwatch Stopwatch { get; set; }
public LogAttribute(string logFlag) {
LogFlag = logFlag;
}
public override void OnActionExecuting(ActionExecutingContext context) {
base.OnActionExecuting(context);
// 后续添加了获取请求的请求体,若是在实际项目中不须要删除便可
long contentLen = context.HttpContext.Request.ContentLength == null ? 0 : context.HttpContext.Request.ContentLength.Value;
if (contentLen > 0) {
// 读取请求体中全部内容
System.IO.Stream stream = context.HttpContext.Request.Body;
if (context.HttpContext.Request.Method == "POST") {
stream.Position = 0;
}
byte[] buffer = new byte[contentLen];
stream.Read(buffer, 0, buffer.Length);
// 转化为字符串
RequestBody = System.Text.Encoding.UTF8.GetString(buffer);
}
ActionArguments = Newtonsoft.Json.JsonConvert.SerializeObject(context.ActionArguments);
Stopwatch = new Stopwatch();
Stopwatch.Start();
}
public override void OnActionExecuted(ActionExecutedContext context) {
base.OnActionExecuted(context);
Stopwatch.Stop();
string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString;
string method = context.HttpContext.Request.Method;
string qs = ActionArguments;
dynamic result = context.Result.GetType().Name == "EmptyResult" ? new { Value = "无返回结果" } : context.Result as dynamic;
string res = "在返回结果前发生了异常";
try {
if (result != null) {
res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value);
}
} catch (System.Exception) {
res = "日志未获取到结果,返回的数据没法序列化";
}
LogException.AddLog($"\n 方法:{LogFlag} \n " +
$"地址:{url} \n " +
$"方式:{method} \n " +
$"请求体:{RequestBody} \n " +
$"参数:{qs}\n " +
$"结果:{res}\n " +
$"耗时:{Stopwatch.Elapsed.TotalMilliseconds} 毫秒(指控制器内对应方法执行完毕的时间)");
}
}