.net 8中使用过滤器记录系统日志 ActionFilter+Serilog
1、添加自定义日志过滤器类
using Serilog;
using Microsoft.AspNetCore.Mvc.Filters;
namespace ADTO.CMS.Common.Filter
{
/// <summary>
/// 日志记录过滤器
/// </summary>
public class LogActionFilter : IActionFilter
{
/// <summary>
/// 在动作执行前记录日志
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
Log.Information("Starting action {ActionName} on controller {ControllerName}",
context.ActionDescriptor.RouteValues["action"],
context.ActionDescriptor.RouteValues["controller"]);
}
/// <summary>
/// 动作完成后记录日志
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception != null)
{
// 如果发生异常,记录错误日志
Log.Error(context.Exception, "系统异常,方法= {ActionName},控制器= {ControllerName}",
context.ActionDescriptor.RouteValues["action"],
context.ActionDescriptor.RouteValues["controller"]
);
}
else
{
// 在动作执行后记录日志
Log.Information("执行完成,方法= {ActionName} ,控制器={ControllerName},执行状态码= {StatusCode}",
context.ActionDescriptor.RouteValues["action"],
context.ActionDescriptor.RouteValues["controller"],
context.HttpContext.Response.StatusCode);
}
#region//指定只保存到数据库方式
//if (context.Exception != null)
//{
// // 如果发生异常,记录错误日志
// Log.ForContext("LogToDatabase", true).Error(context.Exception, "系统异常,方法= {ActionName},控制器= {ControllerName}",
// context.ActionDescriptor.RouteValues["action"],
// context.ActionDescriptor.RouteValues["controller"]
// );
//}
//else
//{
// // 在动作执行后记录日志
// Log.ForContext("LogToDatabase", true).Information("执行完成,方法= {ActionName} ,控制器={ControllerName},执行状态码= {StatusCode}",
// context.ActionDescriptor.RouteValues["action"],
// context.ActionDescriptor.RouteValues["controller"],
// context.HttpContext.Response.StatusCode);
//}
#endregion
}
}
2、在Program中注入日志过滤器
#region 日志过滤器
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.WriteTo.Console()
.WriteTo.File("logs/myapp.txt", rollingInterval: RollingInterval.Day)
.WriteTo.MySQL(connectionString: builder.Configuration.GetConnectionString("Default"), tableName: "Sys_Logs")
.CreateLogger();
#region 指定内容分别存入文本或者数据库(这种方式会自动创建表,上面的不会),上面方式是全部同步保存
//// 写入到数据库
//.WriteTo.Conditional(evt => evt.Properties.ContainsKey("LogToDatabase"), wt =>
// wt.MySQL(connectionString: builder.Configuration.GetConnectionString("Default"), tableName: "Sys_Logs"))
//// 写入到文本文件
//.WriteTo.Conditional(evt => evt.Properties.ContainsKey("LogToDatabase"), wt =>
// wt.File("logs/myapp.txt", rollingInterval: RollingInterval.Day))
//.CreateLogger();
#endregion
builder.Services.AddControllers(options =>
{
options.Filters.Add(typeof(LogActionFilter));
});
#endregion