NCore使用Serilog日志
第一步:NuGet 安装
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Formatting.Compact
dotnet addpackage Serilog.Sinks.File
dotnet addpackage Serilog.Sinks.MSSqlServer
第二步:创建 RequestLoggingFilter.cs
public class RequestLoggingFilter : IActionFilter { private readonly Serilog.ILogger _logger;//注入serilog private Stopwatch _stopwatch;//统计程序耗时 public RequestLoggingFilter(Serilog.ILogger logger) { _logger = logger; _stopwatch = Stopwatch.StartNew(); } public void OnActionExecuted(ActionExecutedContext context) { _stopwatch.Stop(); var request = context.HttpContext.Request; var response = context.HttpContext.Response; _logger .ForContext("RequestJson", request.QueryString)//请求字符串 .ForContext("ResponseJson", JsonSerializer.Serialize(context.Result))//响应数据json .Information("Request {Method} {Path} responded {StatusCode} in {Elapsed:0.0000} ms",//message request.Method, request.Path, response.StatusCode, _stopwatch.Elapsed.TotalMilliseconds); } public void OnActionExecuting(ActionExecutingContext context) { } }
第三步:SeriLogExtensions.cs
public static class SeriLogExtensions { public static void AddSerilLog(this ConfigureHostBuilder configureHostBuilder) { //输出模板 string outputTemplate = "{NewLine}【{Level:u3}】{Timestamp:yyyy-MM-dd HH:mm:ss.fff}" + "{NewLine}#Msg#{Message:lj}" + "{NewLine}#Pro #{Properties:j}" + "{NewLine}#Exc#{Exception}" + new string('-', 50); // 配置Serilog Log.Logger = new LoggerConfiguration() .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // 排除Microsoft的日志 .Enrich.FromLogContext() // 注册日志上下文 .WriteTo.Console(outputTemplate: outputTemplate) // 输出到控制台 .WriteTo.MSSqlServer("Server=60.247.147.126;database=microdb;uid=sa;pwd=.mssql.;TrustServerCertificate=True;", sinkOptions: GetSqlServerSinkOptions(), columnOptions: GetColumnOptions()) .WriteTo.Logger(configure => configure // 输出到文件 .MinimumLevel.Debug() .WriteTo.File( //单个日志文件,总日志,所有日志存到这里面 $"logs\\log.txt", rollingInterval: RollingInterval.Day, outputTemplate: outputTemplate) .WriteTo.File( //每天生成一个新的日志,按天来存日志 "logs\\{Date}-log.txt", //定输出到滚动日志文件中,每天会创建一个新的日志,按天来存日志 retainedFileCountLimit: 7, outputTemplate: outputTemplate )) .CreateLogger(); configureHostBuilder.UseSerilog(Log.Logger); // 注册serilog /// <summary> /// 设置日志sqlserver配置 /// </summary> /// <returns></returns> MSSqlServerSinkOptions GetSqlServerSinkOptions() { var sqlsinkotpions = new MSSqlServerSinkOptions(); sqlsinkotpions.TableName = "sys_Serilog";//表名称 sqlsinkotpions.SchemaName = "dbo";//数据库模式 sqlsinkotpions.AutoCreateSqlTable = true;//是否自动创建表 return sqlsinkotpions; } /// <summary> /// 设置日志sqlserver 列配置 /// </summary> /// <returns></returns> ColumnOptions GetColumnOptions() { var customColumnOptions = new ColumnOptions(); customColumnOptions.Store.Remove(StandardColumn.MessageTemplate);//删除多余的这两列 customColumnOptions.Store.Remove(StandardColumn.Properties); var columlist = new List<SqlColumn>(); columlist.Add(new SqlColumn("RequestJson", SqlDbType.NVarChar, true, 2000));//添加一列,用于记录请求参数string columlist.Add(new SqlColumn("ResponseJson", SqlDbType.NVarChar, true, 2000));//添加一列,用于记录响应数据 customColumnOptions.AdditionalColumns = columlist; return customColumnOptions; } } }
第四步:Program.cs 配置
builder.Services.AddControllers(options => { options.Filters.Add(typeof(RequestLoggingFilter)); }); builder.Host.AddSerilLog();
第五步:运行结果
文件日志记录:
MSSQL数据记录:
日志信息包括:
- Message:日志信息
- Level:等级
- TimeStamp:记录日志时间
- Exception:异常信息
- RequestJson:请求参数json
- ResponseJson:响应结果json
参考:https://www.cnblogs.com/taotaozhuanyong/p/13816181.html