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

浙公网安备 33010602011771号