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
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 | 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
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 | 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 配置
1 2 3 4 5 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?