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

[复制链接]
发表于 2024-8-28 04:26:00 | 显示全部楼层 |阅读模式
前言 

最近使用最新版的Serilog记载日志日志时,发现从前有些关于Serilog的Nuget弃用了,最关键的是有些配置写法也改变,于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用
说明:我是用的.Net6,最新恒久支持版到.Net8了,不过Serilog我用的是最新版,配置方式都一样
1.安装Serilog相关Nuget包

新版Serilog相关Nuget
  1. Serilog.AspNetCore
  2. Serilog.Expressions
  3. Serilog.Sinks.File
复制代码
也可以把下面代码直接放入.csjproj工程项目文件中,把这三个包引用放进ItemGroup标签内,所需Nuget包会自动下载,
  1. <ItemGroup>
  2.   <PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
  3.   <PackageReference Include="Serilog.Expressions" Version="4.0.0" />
  4.   <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
  5. </ItemGroup>
复制代码

版本如下 

2.Program代码如下

  1. using Serilog;
  2. namespace WebAppNet6_Serilog
  3. {
  4.     public class Program
  5.     {
  6.         public static void Main(string[] args)
  7.         {
  8.             var builder = WebApplication.CreateBuilder(args);
  9.             //使用Serilog
  10.             builder.Host.UseSerilog((context, logger) =>
  11.             {
  12.                 //Serilog读取配置
  13.                 logger.ReadFrom.Configuration(context.Configuration);
  14.                 logger.Enrich.FromLogContext();
  15.             });
  16.             // Add services to the container.
  17.             builder.Services.AddControllers();
  18.             // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  19.             builder.Services.AddEndpointsApiExplorer();
  20.             builder.Services.AddSwaggerGen();
  21.             var app = builder.Build();
  22.             // Configure the HTTP request pipeline.
  23.             if (app.Environment.IsDevelopment())
  24.             {
  25.                 app.UseSwagger();
  26.                 app.UseSwaggerUI();
  27.             }
  28.             app.UseAuthorization();
  29.             app.MapControllers();
  30.             app.Run();
  31.         }
  32.     }
  33. }
复制代码
 3.配置文件(appsetting.json)代码如下

  1. "Serilog": {
  2.    //"Using": [
  3.    //  "Serilog.Sinks.RollingFile", //老版本的写入日志日志文件的Nuget包,现在已经弃用,请改用Serilog.Sinks.File
  4.    //  "Serilog.Sinks.Console",
  5.    //  "Serilog.Filters.Expressions" //老版本日志日志过滤Nuget包,现在已经弃用,请改用Serilog.Expressions
  6.    //],
  7.    "Using": [ "Serilog.Sinks.File", "Serilog.Expressions" ],
  8.    "MinimumLevel": {
  9.      "Default": "Information", //最小记录日志级别
  10.      "Override": {
  11.        "Default": "Information",
  12.        "System": "Information",
  13.        "Microsoft": "Information"
  14.      }
  15.    },
  16.    "Enrich": [ "FromLogContext", "WithThreadId" ],
  17.    "WriteTo": [
  18.      {
  19.        "Name": "Console",
  20.        "Args": {
  21.          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [{Level}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
  22.        }
  23.      },
  24.      {
  25.        "Name": "Logger",
  26.        "Args": {
  27.          "configureLogger": {
  28.            "Filter": [
  29.              {
  30.                "Name": "ByIncludingOnly",
  31.                "Args": {
  32.                  "expression": "@l = 'Information'"
  33.                }
  34.              }
  35.            ],
  36.            "WriteTo": [
  37.              {
  38.                "Name": "File",
  39.                "Args": {
  40.                  "path": "Logs/Info/log.txt",
  41.                  "rollingInterval": "Day",
  42.                  //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} LogLevel:{Level} {Message:lj}{NewLine}{Exception}"
  43.                  "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
  44.                }
  45.              }
  46.            ]
  47.          }
  48.        }
  49.      },
  50.      {
  51.        "Name": "Logger",
  52.        "Args": {
  53.          "configureLogger": {
  54.            "Filter": [
  55.              {
  56.                "Name": "ByIncludingOnly",
  57.                "Args": {
  58.                  "expression": "@l= 'Warning'"
  59.                }
  60.              }
  61.            ],
  62.            "WriteTo": [
  63.              {
  64.                "Name": "File",
  65.                "Args": {
  66.                  "path": "Logs/Warn/log.txt",
  67.                  "rollingInterval": "Day",
  68.                  //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} WARNING {ClassName}:0 - [{Version}] [{HttpRequestIP}] [{AppName}] {Message:lj}{NewLine}{Exception}"
  69.                  //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff}[{Level}]{HttpRequestId}{Message:lj}{NewLine}{Exception}{NewLine}"
  70.                  "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
  71.                }
  72.              }
  73.            ]
  74.          }
  75.        }
  76.      },
  77.      {
  78.        "Name": "Logger",
  79.        "Args": {
  80.          "configureLogger": {
  81.            "Filter": [
  82.              {
  83.                "Name": "ByIncludingOnly",
  84.                "Args": {
  85.                  "expression": "@l= 'Error'"
  86.                }
  87.              }
  88.            ],
  89.            "WriteTo": [
  90.              {
  91.                "Name": "File",
  92.                "Args": {
  93.                  "path": "Logs/Error/log.txt",
  94.                  "rollingInterval": "Day",
  95.                  //"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} ERROR {ClassName}:0 - [{Version}] [{HttpRequestIP}] [{AppName}] {Message:lj}{NewLine}{Exception}"
  96.                  "outputTemplate": "【时间】{Timestamp:yyyy-MM-dd HH:mm:ss,fff}{NewLine}【等级】[{Level}]{NewLine}【消息】[{SourceContext}] {Message:lj}{NewLine}{Exception}{NewLine}"
  97.                }
  98.              }
  99.            ]
  100.          }
  101.        }
  102.      }
  103.    ]
  104. }
复制代码
4.依赖注入方式使用Serilog记载日志文件

这里为了方便测试代码,直接在WeatherForecastController(.Net Core创建WebAPI时的一个Controller)中使用
  1.   private readonly ILogger<WeatherForecastController> _logger;
  2.   //注入日志
  3.   public WeatherForecastController(ILogger<WeatherForecastController> logger)
  4.   {
  5.       _logger = logger;
  6.   }
  7.   [HttpGet(Name = "GetWeatherForecast")]
  8.   public IEnumerable<WeatherForecast> Get()
  9.   {
  10.       //记录日志
  11.       _logger.LogInformation("测试LogInformation");
  12.       _logger.LogWarning("测试LogWarning");
  13.       _logger.LogError("测试LogError");
  14.       return Enumerable.Range(1, 5).Select(index => new WeatherForecast
  15.       {
  16.           Date = DateTime.Now.AddDays(index),
  17.           TemperatureC = Random.Shared.Next(-20, 55),
  18.           Summary = Summaries[Random.Shared.Next(Summaries.Length)]
  19.       })
  20.       .ToArray();
  21.   }
复制代码
5.结果

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

参考资料
https://www.cnblogs.com/zy-2015/p/15778002.html



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-7-23 10:54 , Processed in 0.093529 second(s), 30 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表