ASP.NET 8 日志处理之Serilog

1、安装依赖包

Serilog:

NuGet\Install-Package Serilog -Version 4.0.0-dev-02122

Serilog.Sinks.Console:

NuGet\Install-Package Serilog.Sinks.Console -Version 5.0.1

Serilog.Sinks.File:

NuGet\Install-Package Serilog.Sinks.File -Version 5.0.1-dev-00972

Serilog.Sinks.MSSqlServer:

NuGet\Install-Package Serilog.Sinks.MSSqlServer -Version 6.6.1-dev-00074

Serilog.AspNetCore:

NuGet\Install-Package Serilog.AspNetCore -Version 8.0.2-dev-00334

2、添加静态类SerilogConfig

注意更改数据库连接字符串

public static class SerilogConfig
{
    public static void CreateLogger()
    {
        var filePath = Path.Combine(AppContext.BaseDirectory, "Logs/Serilog/log.txt");
        var logDB = @"Server=;database=demo1;uid=;pwd=;TrustServerCertificate=true";
        var sinkOpts = new MSSqlServerSinkOptions();
        sinkOpts.TableName = "Logs_Serilog";
        sinkOpts.AutoCreateSqlTable = true;
        sinkOpts.BatchPostingLimit = 1;
        sinkOpts.BatchPeriod = TimeSpan.FromSeconds(1);
        var columnOpts = new ColumnOptions();
        //columnOpts.Store.Remove(StandardColumn.Properties);
        //columnOpts.Store.Add(StandardColumn.LogEvent);
        //columnOpts.LogEvent.DataLength = 2048;
        //columnOpts.PrimaryKey = columnOpts.TimeStamp;
        //columnOpts.TimeStamp.NonClusteredIndex = true;
        columnOpts.Store.Remove(StandardColumn.MessageTemplate);
        columnOpts.Properties.ExcludeAdditionalProperties = true;
        columnOpts.AdditionalColumns = new Collection<SqlColumn>
        {
            new SqlColumn{DataType = System.Data.SqlDbType.NVarChar, DataLength = 32, ColumnName = "IP"}
        };

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .WriteTo.Console(
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] ({ThreadId}) {Message}{NewLine}{Exception}")
            .WriteTo.File(filePath,
                outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] ({ThreadId}) {Message:lj}{NewLine}{Exception}",
                rollingInterval: RollingInterval.Day,
                fileSizeLimitBytes: 1073741824) //1GB
            .Enrich.FromLogContext()
            .Enrich.WithProperty("IP",GetIpAddress())
            .WriteTo.MSSqlServer(
                connectionString: logDB,
                sinkOptions: sinkOpts,
                columnOptions: columnOpts
                ).CreateLogger();
    }

    public static void RefreshLogger()
    {
        if (Log.Logger != null)
        {
            Log.CloseAndFlush();
        }
        CreateLogger();
    }

    private static string GetIpAddress()
    {
        string ipAddress = "127.0.0.1";
        IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
        foreach (IPAddress ip in ips)
        {
            if (ip.AddressFamily.ToString().ToLower().Equals("internetwork"))
            {
                ipAddress = ip.ToString();
                return ipAddress;
            }
        }

        return ipAddress;
    }
}

3、Program.cs中配置

SerilogConfig.CreateLogger();
Log.Information("Starting web application");
builder.Host.UseSerilog();

4、使用

Controller中添加Serilog.Log类的静态方法记录日志,非Serilog.Log记录的日志也会记录到Console,File和DataBase:

private readonly ILogger<A01BaseController> _logger;

public A01BaseController(ILogger<A01BaseController> logger)
{
    _logger = logger;
    _logger.LogInformation($"LogInformation: {this.GetType().FullName}开始日志...ILogger");
    _logger.LogInformation($"LogInformation: {this.GetType().FullName}被构造...ILogger");
    _logger.LogError($"LogError: {this.GetType().FullName}被构造...ILogger");
    _logger.LogDebug($"LogDebug: {this.GetType().FullName}被构造...ILogger");
    _logger.LogWarning($"LogWarning: {this.GetType().FullName}被构造...ILogger");
    _logger.LogInformation($"LogInformation: {this.GetType().FullName}结束日志...ILogger");

    Log.Information($"LogInformation: {this.GetType().FullName}开始日志...Serilog");
    Log.Information($"LogInformation: {this.GetType().FullName}被构造...Serilog");
    Log.Error($"LogError: {this.GetType().FullName}被构造...Serilog");
    Log.Debug($"LogDebug: {this.GetType().FullName}被构造...Serilog");
    Log.Warning($"LogWarning: {this.GetType().FullName}被构造...Serilog");
    Log.Information($"LogInformation: {this.GetType().FullName}结束日志...Serilog");
}

tips:

通过ILoggerFactory创建logger实例:

private readonly ILoggerFactory _loggerFactory;
private readonly ILogger<A01BaseController> _logger;

public A01BaseController(ILoggerFactory loggerFactory)
{
    this._loggerFactory = loggerFactory;
    _logger = _loggerFactory.CreateLogger<A01BaseController>();

    _logger.LogInformation($"LogInformation: {this.GetType().FullName}开始日志...ILogger");
    _logger.LogInformation($"LogInformation: {this.GetType().FullName}被构造...ILogger");
    _logger.LogError($"LogError: {this.GetType().FullName}被构造...ILogger");
    _logger.LogDebug($"LogDebug: {this.GetType().FullName}被构造...ILogger");
    _logger.LogWarning($"LogWarning: {this.GetType().FullName}被构造...ILogger");
    _logger.LogInformation($"LogInformation: {this.GetType().FullName}结束日志...ILogger");
}

ASP.NET MVC中使用Serilog进行日期滚动可以通过调整Serilog的配置来实现。 Serilog是一个功能强大的日志记录库,它提供了很多配置选项来满足不同的需求。其中一个配置选项就是日期滚动,可以根据需求进行设置。 要实现日期滚动,首先需要在项目中安装Serilog的NuGet包。然后,在项目的启动文件(通常是Global.asax.cs)中进行Serilog的配置。 配置Serilog时,可以使用RollingFile来指定日志文件的滚动方式。例如,下面的代码片段将日志文件设置为每天滚动一次: ```csharp Log.Logger = new LoggerConfiguration() .WriteTo.RollingFile(pathFormat: "Logs\\log-{Date}.txt") .CreateLogger(); ``` 在上面的代码中,RollingFile方法的pathFormat参数是一个包含日期占位符的字符串,当日期发生变化时,日志文件将滚动到下一个文件。此处的{Date}就表示日期占位符,会被替换为实际的日期。 需要注意的是,上述代码中的路径是相对于项目的根目录的。如果希望日志文件保存在其他位置,可以根据实际需求进行调整。 另外,还可以使用其他日期占位符来满足更精细的日期滚动需求。例如,可以使用{HalfHour}表示每半小时滚动一次日志文件,使用{Month}表示每个月滚动一次日志文件等。 总结来说,通过配置Serilog的RollingFile选项,可以实现在ASP.NET MVC中使用Serilog进行日期滚动。具体的配置方式可以根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄健华Yeah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值