当前位置: 首页 > news >正文

【开发技术】.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(){//单个文件最大长度为3MBvar _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 和可插拔的输出器及格式化器,使得开发者能够轻松定制和扩展日志记录功能。同时在学习新的技术的过程中,建议大家可以多看看源代码,很多网络上的内容可能环境和版本不同,不一定完全跑的通。共勉!

http://www.dtcms.com/a/306227.html

相关文章:

  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘dash’问题
  • Python爬虫实战:研究python-readability库相关技术构建网页内容提取系统
  • sqli-labs:Less-6关卡详细解析
  • nodejs项目中常用的npm包及分类
  • 个人如何做股指期货?
  • 高职工业数据采集与边缘服务应用实训室解决方案
  • npm run dev 启动项目 报Error: listen EACCES: permission denied 0.0.0.0:80 解决方法
  • NPM组件 @0xme5war/apicli 等窃取主机敏感信息
  • vue create 项目名 和 npm init vue@latest 创建vue项目的不同
  • Vue2-封装一个看起来像左右分布表格的表单组件
  • python基础:用户输入和 while 循环
  • 学习日志22 python
  • 2024 年 NOI 最后一题题解
  • 从0到1学PHP(八):PHP 与 MySQL 数据库:数据持久化存储
  • Spring AI 海运管理应用第2部分
  • 关于市场成交量和散户操作错误率的提问和思考。
  • QT笔记(2)——vscode + CMAKE + qtcreate的操作方式
  • 【PostgreSQL内核学习:WindowAgg 帧优化与节点去重】
  • 【Unity3D实例-功能-移动】复杂移动(Blend Tree方式)
  • 169-Django二手交易校园购物系统开发分享
  • django-4事务
  • 游戏盾是如何做到免疫攻击的
  • Android自定义游戏view积累
  • 从混乱走向高效:重塑企业IT服务管理的未来路径
  • 【网络运维】Linux:软件包管理
  • python案例分析:基于抖音评论的文本分析,使用svm算法进行情感分析以及LDA主题分析,准确率接近90%
  • Qt Quick 可视化组件应用
  • 应用药品 GMP 证书识别技术,实现证书信息的自动化、精准化提取与核验
  • OriGene:一种可自进化的虚拟疾病生物学家,实现治疗靶点发现自动化
  • RK3568下的进程间通信:基于UDP的mash网络节点通信