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

posted @ 2024-01-10 09:51  microsoft-zhcn  阅读(10)  评论(0编辑  收藏  举报