ASP.NET 8 日志处理之Serilog

本文介绍了如何在ASP.NETCore应用中安装并配置Serilog,包括使用NuGet包管理器安装Serilog及其扩展,如Serilog.Sinks.Console、Serilog.Sinks.File和Serilog.Sinks.MSSqlServer。还展示了如何通过静态类创建Logger,以及如何在Controller中使用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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

懂营养的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值