【开发技术】.Net中配置Serilog日志分级记录

目录

一、目的

二、解决方案

2.1 下载serilog包

2.2 Serilog配置

2.2.1 使用多个File sink配置不同的最小日志级别

2.2.2 使用Filter条件分流到不同文件

三、使用建议

四、文章总结


一、目的

        在日常开发中,需要根据不同的场景去记录日志,根据实际需求精细化控制日志输出。避免所有类型的日志同时记录在一个日志文件中,产生过多的冗余日志。在.Net开发中,常用的日志记录,有Log4net,Nlog,Serilog等第三方日志库。文章主要讲解Serilog的日志分级记录方式。

        源码地址:https://github.com/serilog/seriloghttps://github.com/serilog/serilog

        支持按场景或组件设置不同日志级别,例如:

  •  Debug ‌:仅记录调试信息
  •  Information ‌:记录常规运行信息
  •  Warning ‌:记录潜在问题警告
  •  Error ‌:记录错误信息

二、解决方案

2.1 下载serilog包

dotnet add packages Serilog

(这是核心日志记录库,提供了结构化日志记录的基础功能,支持多种日志输出方式和灵活的配置选项‌。)

dotnet add packages Serilog.Sinks.Async

(这是一个扩展包,用于异步写入日志,可以提高应用程序性能,避免日志记录阻塞主线程‌。)

dotnet add packages Serilog.Sinks.Console

(这个包用于将日志输出到控制台,方便开发调试时实时查看日志信息‌。)

dotnet add packages Serilog.Sinks.File

(这个包用于将日志写入文件,支持滚动日志文件(按时间或大小分割)等功能,适合生产环境使用‌。)

2.2 Serilog配置

2.2.1 使用多个File sink配置不同的最小日志级别

var log = new LoggerConfiguration()
    // 信息级别日志
    .WriteTo.File("logs/information/log-.txt",
        restrictedToMinimumLevel: LogEventLevel.Information,
        rollingInterval: RollingInterval.Day)
    // 错误级别日志
    .WriteTo.File("logs/error/log-.txt",
        restrictedToMinimumLevel: LogEventLevel.Error,
        rollingInterval: RollingInterval.Day)
    // 调试级别日志
    .WriteTo.File("logs/debug/log-.txt",
        restrictedToMinimumLevel: LogEventLevel.Debug,
        rollingInterval: RollingInterval.Day)
    .CreateLogger();

2.2.2 使用Filter条件分流到不同文件

using Serilog.Events;
using Serilog;
using System;
using System.IO;
using System.Reflection;
using System.Configuration;

namespace Demo.Utils
{
    public class SerilogConfiguration
    {
        public static void Config()
        {
            //单个文件最大长度为3MB
            var _fileSizeLimitBytes = 3 * 1024 * 1024;
            //初始化logger配置对象
            var LoggerConfiguration = new LoggerConfiguration();
            //根据配置文件内容确定日志初始化级别
            var loglevel = ConfigurationManager.AppSettings["loglevel"];
            //初始化配置
            var log = LoggerConfiguration.MinimumLevel.Debug()
                            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                            .Enrich.FromLogContext()
                            .WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Information)
                                .WriteTo.Async(x => x.File(Path.Combine(AppContext.BaseDirectory, "logs", DateTime.Now.ToString("yyyy-MM-dd"), "Information",
                                        $"{Assembly.GetExecutingAssembly().GetName().Name}-.txt"),
                                        rollingInterval: RollingInterval.Day,
                                        rollOnFileSizeLimit: true,
                                        fileSizeLimitBytes: _fileSizeLimitBytes,
                                        encoding: System.Text.Encoding.UTF8,
                                        retainedFileCountLimit: 30)))
                            .WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Warning)
                                .WriteTo.Async(x => x.File(Path.Combine(AppContext.BaseDirectory, "logs", DateTime.Now.ToString("yyyy-MM-dd"), "Warning",
                                        $"{Assembly.GetExecutingAssembly().GetName().Name}-.txt"),
                                        rollingInterval: RollingInterval.Day,
                                        rollOnFileSizeLimit: true,
                                        fileSizeLimitBytes: _fileSizeLimitBytes,
                                        encoding: System.Text.Encoding.UTF8,
                                        retainedFileCountLimit: 30)))
                            .WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Error)
                                 .WriteTo.Async(x => x.File(Path.Combine(AppContext.BaseDirectory, "logs", DateTime.Now.ToString("yyyy-MM-dd"), "Error",
                                         $"{Assembly.GetExecutingAssembly().GetName().Name}-.txt"),
                                         rollingInterval: RollingInterval.Day,
                                         rollOnFileSizeLimit: true,
                                         fileSizeLimitBytes: _fileSizeLimitBytes,
                                         encoding: System.Text.Encoding.UTF8,
                                         retainedFileCountLimit: 30)));

            //查看Debug日志,根据配置文件考虑是否开放
            if (!string.IsNullOrEmpty(loglevel) && loglevel.Equals("0"))
            {
                log = log.WriteTo.Logger(lc => lc.Filter.ByIncludingOnly(evt => evt.Level == LogEventLevel.Debug)
                                .WriteTo.Async(x => x.File(Path.Combine(AppContext.BaseDirectory, "logs", DateTime.Now.ToString("yyyy-MM-dd"), "Debug",
                                        $"{Assembly.GetExecutingAssembly().GetName().Name}-.txt"),
                                        rollingInterval: RollingInterval.Day,
                                        rollOnFileSizeLimit: true,
                                        fileSizeLimitBytes: _fileSizeLimitBytes,
                                        encoding: System.Text.Encoding.UTF8,
                                        retainedFileCountLimit: 30)));
            }
            //创建Serilog日志
            Log.Logger = log.CreateLogger();

        }
    }
}

ps:关键配置说明:
1.    restrictedToMinimumLevel: 设置该sink接收的最小日志级别
2.    rollingInterval: 设置日志文件滚动间隔(如每天)
3.    Filter.ByIncludingOnly(): 使用表达式精确筛选要写入的日志级别

三、使用建议

        考虑使用appsettings.json配置,便于修改:

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "logs/information/log-.txt",
          "restrictedToMinimumLevel": "Information",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/error/log-.txt",
          "restrictedToMinimumLevel": "Error",
          "rollingInterval": "Day"
        }
      }
    ]
  }
}

         在 Program.cs 中读取配置并初始化 Serilog

using Serilog;
using Microsoft.Extensions.Configuration;

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

Log.Information("Hello, Serilog with appsettings.json!");
Log.CloseAndFlush();

四、文章总结

        Serilog 是一个功能强大的日志记录库,它提供了丰富的 API 和可插拔的输出器及格式化器,使得开发者能够轻松定制和扩展日志记录功能。同时在学习新的技术的过程中,建议大家可以多看看源代码,很多网络上的内容可能环境和版本不同,不一定完全跑的通。共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

勿芮介

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

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

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

打赏作者

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

抵扣说明:

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

余额充值