.Net Core(.Net6) 使用Serilog按日志等级写入日志,appsetting.json配置方式实现

前言 

最近使用最新版的Serilog记录日志时,发现以前有些关于Serilog的Nuget弃用了,最关键的是有些配置写法也改变,于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用

说明:我是用的.Net6,最新长期支持版到.Net8了,不过Serilog我用的是最新版,配置方式都一样

1.安装Serilog相关Nuget包

新版Serilog相关Nuget

Serilog.AspNetCore
Serilog.Expressions
Serilog.Sinks.File

也可以把下面代码直接放入.csjproj工程项目文件中,把这三个包引用放进ItemGroup标签内,所需Nuget包会自动下载

 <ItemGroup>
  <PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
  <PackageReference Include="Serilog.Expressions" Version="4.0.0" />
  <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
 </ItemGroup>

 

旧版本如下 

 

2.Program代码如下

 

using Serilog;
namespace WebAppNet6_Serilog
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            //使用Serilog
            builder.Host.UseSerilog((context, logger) =>
            {
                //Serilog读取配置
                logger.ReadFrom.Configuration(context.Configuration);
                logger.Enrich.FromLogContext();
            });
 
            // Add services to the container.
 
            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();
 
            var app = builder.Build();
 
            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }
 
            app.UseAuthorization();
 
 
            app.MapControllers();
 
            app.Run();
        }
    }
}

 

 3.配置文件(appsetting.json)代码如下

 

 "Serilog": {
   //"Using": [
   //  "Serilog.Sinks.RollingFile", //老版本的写入日志文件的Nuget包,现在已经弃用,请改用Serilog.Sinks.File
   //  "Serilog.Sinks.Console",
   //  "Serilog.Filters.Expressions" //老版本的日志过滤Nuget包,现在已经弃用,请改用Serilog.Expressions
   //],
   "Using": [ "Serilog.Sinks.File", "Serilog.Expressions" ],
   "MinimumLevel": {
     "Default": "Information", //最小记录日志级别
     "Override": {
       "Default": "Information",
       "System": "Information",
       "Microsoft": "Information"
     }
   },
   "Enrich": [ "FromLogContext", "WithThreadId" ],
   "WriteTo": [
     {
       "Name": "Console",
       "Args": {
         "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [{Level}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
       }
     },
     {
       "Name": "Logger",
       "Args": {
         "configureLogger": {
           "Filter": [
             {
               "Name": "ByIncludingOnly",
               "Args": {
                 "expression": "@l = 'Information'"
               }
             }
           ],
           "WriteTo": [
             {
               "Name": "File",
               "Args": {
                 "path": "Logs/Info/log.txt",
                 "rollingInterval": "Day",
                 //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} LogLevel:{Level} {Message:lj}{NewLine}{Exception}"
                 "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
               }
             }
           ]
         }
       }
     },
     {
       "Name": "Logger",
       "Args": {
         "configureLogger": {
           "Filter": [
             {
               "Name": "ByIncludingOnly",
               "Args": {
                 "expression": "@l= 'Warning'"
               }
             }
           ],
           "WriteTo": [
             {
               "Name": "File",
               "Args": {
                 "path": "Logs/Warn/log.txt",
                 "rollingInterval": "Day",
                 //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} WARNING {ClassName}:0 - [{Version}] [{HttpRequestIP}] [{AppName}] {Message:lj}{NewLine}{Exception}"
                 //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff}[{Level}]{HttpRequestId}{Message:lj}{NewLine}{Exception}{NewLine}"
                 "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
               }
             }
           ]
         }
       }
     },
     {
       "Name": "Logger",
       "Args": {
         "configureLogger": {
           "Filter": [
             {
               "Name": "ByIncludingOnly",
               "Args": {
                 "expression": "@l= 'Error'"
               }
             }
           ],
           "WriteTo": [
             {
               "Name": "File",
               "Args": {
                 "path": "Logs/Error/log.txt",
                 "rollingInterval": "Day",
                 //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} ERROR {ClassName}:0 - [{Version}] [{HttpRequestIP}] [{AppName}] {Message:lj}{NewLine}{Exception}"
                 "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
               }
             }
           ]
         }
       }
     }
 
   ]
 }

 

4.依赖注入方式使用Serilog记录日志文件

这里为了方便测试代码,直接在WeatherForecastController(.Net Core创建WebAPI时的一个Controller)中使用

  private readonly ILogger<WeatherForecastController> _logger;
 
  //注入日志
  public WeatherForecastController(ILogger<WeatherForecastController> logger)
  {
      _logger = logger;
  }
 
  [HttpGet(Name = "GetWeatherForecast")]
  public IEnumerable<WeatherForecast> Get()
  {
      //记录日志
      _logger.LogInformation("测试LogInformation");
      _logger.LogWarning("测试LogWarning");
      _logger.LogError("测试LogError");
      return Enumerable.Range(1, 5).Select(index => new WeatherForecast
      {
          Date = DateTime.Now.AddDays(index),
          TemperatureC = Random.Shared.Next(-20, 55),
          Summary = Summaries[Random.Shared.Next(Summaries.Length)]
      })
      .ToArray();
  }

5.效果

按日志级别,记录的内容就在这三个txt日志文件中

 

posted @ 2024-09-08 19:58  Misterj  阅读(238)  评论(0)    收藏  举报