.Net Core 过滤器记录全局日志
过滤器
- IActionFilter
- IAuthorizationFilter
- IExceptionFilter
- IResourceFilter
- IResultFilter
ActionFilter过滤器
public class ActionFilter : IActionFilter
{
private readonly ILogger<ActionFilter> _logger;
public ActionFilter(ILogger<ActionFilter> logger)
{
_logger = logger;
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
//校验参数
if (!context.ModelState.IsValid)
{
context.Result = new ContentResult()
{
Content = context.ModelState.Values.SelectMany(e => e.Errors).Select(e => e.ErrorMessage).FirstOrDefault(),
StatusCode = 500,
ContentType = "application/json"
};
}
context.HttpContext.Request.ContentType = "application/json";
var PortName = context.HttpContext.Request.Path;//获得调用接口,
var RequestType = context.HttpContext.Request.Method;
//var StatusCode = Convert.ToInt32(new HttpResponseMessage(HttpStatusCode.OK).StatusCode);//设置状态码
//var ParameterList = context.ActionArguments.FirstOrDefault().Value.ToJson();//获得参数值
//参数读取
if (RequestType == "POST" || RequestType == "PUT" || RequestType == "DELETE")
{
var httpContext = context.HttpContext;
var request = httpContext.Request;
request.Body.Position = 0;
StreamReader sr = new StreamReader(request.Body);
string body = sr.ReadToEndAsync().Result;
_logger.LogInformation("\r\n请求日志: "+PortName.Value+"\r\n" + body);
//具体业务, 如果要不进入Action给ActionExecutingContext 对象的Result复制.
context.Result = new ContentResult()
{
Content = "成功了. ",
StatusCode = 200,
ContentType = "application/json"
};
}
else if (RequestType == "GET")
{
var Param= context.HttpContext.Request.Query["Param"];
}
else
{
ReturnFun(context, "无效请求!");
}
}
}
Exception异常过滤器
public class ExceptionFilter : IExceptionFilter
{
readonly ILogger<ExceptionFilter> _logger;
public ExceptionFilter(ILogger<ExceptionFilter> logger)
{
_logger = logger;
}
public void OnException(ExceptionContext context)
{
_logger.LogError("\r\n错误信息: "+context.Exception.Message);
//处理各种异常
var response = new {
Message = "系统错误",
Result = null,
Status = 0
};
context.ExceptionHandled = false;
context.Result = new JsonResult(response);
}
}
使用方式
全局注册方式,也可以在具体的Action上加特性使用
services.AddMvc(o =>
{
o.Filters.Add(typeof(ExceptionFilter));
o.Filters.Add(typeof(ActionFilter));
});
链接: 使用中间件记录日志.