【开发技术】.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.pswp.cn/diannao/93671.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊如何判断发现的缺陷属于前后端

目录 一、观察缺陷现象 二、检查网络请求(核心方法) 三、模拟请求验证后端 四、查看日志 五、数据流分析 六、判断前后端缺陷方法 判断发现的缺陷是前后端,可以通过观察缺陷现象,检查网络请求,查看后端日志&…

Python3与MySQL的PyMySQL连接与应用

Python3与MySQL的PyMySQL连接与应用 引言 随着互联网技术的飞速发展,数据库在各个领域的应用日益广泛。MySQL作为一种开源的关系型数据库管理系统,因其稳定性和高效性,被广泛应用于各种场景。Python作为一种高级编程语言,以其简洁、易读、易学等特点,受到了广大开发者的…

智慧城市SaaS平台|市政公用管理系统

【道路监测运维系统】1.数据可视化a) 实时监控支持对道路监测数据进行分析评估,为道路养护、交通管理、环境保护等提供数据支撑2.道路基础设施监测支持对道路基础设施的运行状态进行实时监测,包括路面状况3.交通流量监测支持对道路交通流量进行实时监测&…

Maven 配置阿里云镜像加速

Maven 配置阿里云镜像加速: 完整配置步骤(Windows 系统) 1. 找到 Maven 的 settings.xml 文件 全局配置:D:\software\apache-maven-3.9.11\conf\settings.xml用户配置:C:\Users\Admin\.m2\settings.xml(推荐…

去除视频字幕 3 : 继续研究 IOPaint,记录几个问题

1. 为什么单独运行,效果很好,批量运行,效果很差。 1. 我运行 iopaint start --modellama --devicecuda --port8080在浏览器中单独选择图片,涂选区域,然后处理,此时的效果非常好。2. 但是我进行 iopaint ru…

【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法

1. 决策树与熵 1.1 决策树简介 下面有一个贷申请样本表,有许多特征 我们根据特征数据生成一棵树,比如年龄有青年,中年,老年三个类别,那么就有三个分支,分别对应着三种类别。如果是青年那么就看工作&#xf…

八股文场景题

如何预估接口上线后的 QPS 问题引入 这个问题其实是一个非常实际的问题,因为我们在开发需求后,例如:新增了一个接口 有一个步骤是值得做的,那就是预估这个接口的QPS 因为我们是可以去调配对应服务器的数量和运行配置的 例如我…

【Web安全】深入浅出理解“SQL注入-伪静态注入”及空格限制绕过技巧

文章目录什么是伪静态注入?伪静态注入中如何绕过空格限制?1. 用注释符替代空格2. 用不可见字符(URL 编码)替代3. 用括号分隔语句4. 用特殊符号替代核心逻辑往期文章【Web安全】一次性搞懂 ReDOS 漏洞原理/检测/防御 【Web安全】一…

【读论文】Step-Audio 2 深度解读:迈向工业级语音交互的「全能型选手」

引言:step-Audio升级 语音交互技术,作为人机交互最自然、最直接的方式之一,正以前所未有的速度发展。从简单的语音指令到流畅的语音对话,我们对 AI 的期望越来越高。然而,要让 AI 真正成为我们的“知心伙伴”,仅仅能“听懂”和“说出”还远远不够。 一个理想的语音 AI,…

java web 重定向

目录结构 demo\day20\src\com\demo\service\Dome1.javademo\day20\src\com\demo\service\Dome2.javademo\day20\src\com\demo\service\Dome3.javademo\day20\src\com\demo\service\Dome4.javademo\day20\web\WEB-INF\lib\javax.servlet.jardemo\day20\web\index.jspdemo\day20\…

MySQL(配置)——MariaDB使用

一、简介 MariaDB 和 MySQL 作为两个流行的关系型数据库管理系统,它们的区别可以从多个角度来探讨。尽管 MariaDB 最初是 MySQL 的一个分支,但随着时间的推移,它们逐渐在功能、性能和开发方向上有所不同。MariaDB 是 MySQL 的一个分支&#x…

Web3:赛道划分与发展趋势解析

区块链技术现在已经从单一的加密货币支付系统发展为涵盖金融、艺术、组织治理和社区文化的多元生态系统。这次我们将深入解析 DeFi(去中心化金融)、NFT(非同质化代币)、DAO(去中心化自治组织)与 MEME&#…

LeetCode 283 - 移动零

思路 使用双指针法,一次遍历完成原地修改。 慢指针 slow:指向下一个非零元素应该被放置的位置。快指针 fast:遍历整个数组,寻找非零元素。 当 fast 遇到非零数时,将其值赋给 slow 指向的位置,然后 slow 前进…

8. 网络层

在复杂的网络环境中确定一个合适的路径.1. IP协议1. 基本概念IP协议:提供一种能力(有非常大的概率,做到某事),把数据报从主机A,跨网络,送到主机B --> 必须要有方式,标识通信两端唯一性!&…

【通识】线性代数(Linear Algebra)

线性代数被广泛应用于抽象代数和泛函分析中;通过解析几何,线性代数能被具体表示,线性代数被泛化为算子理论。而非线性模型被近似为线性模型,应用场景多为自然科学和社会科学。 费马和笛卡尔的工作,线性代数出现于十七世…

Qt 嵌入式界面优化技术

在嵌入式系统中,界面性能直接影响用户体验和系统稳定性。由于嵌入式设备通常资源受限(如低性能 CPU、有限内存、小尺寸屏幕),需针对性优化 Qt 界面以实现流畅显示和高效交互。本文从渲染引擎、资源管理、布局优化到硬件加速&#…

去除视频字幕 4 : 下一步,打算研究 Video Inpainting (视频修复):

就是说,到现在,才算是真正开始,才发现真正的问题。 尝试去除视频上的字幕,使用 IOPaint, 效果很初级。。。问题描述 请帮我分析此时的效果。 此时的右侧字幕区域,闪烁不停!我原本以为效果会很好。实际非常…

代码随想录算法训练营第五十五天|图论part5

并查集理论基础 初始化: void init() {for (int i 0; i < n; i) {father[i] i;} } 寻根&#xff1a; // 并查集里寻根的过程 int find(int u) {return u father[u] ? u : father[u] find(father[u]); // 路径压缩 } 判断u跟v是否同根 // 判断 u 和 v是否找到同一个根 b…

安卓模拟器 adb Frida hook 抓包

基本步骤 adb connect 127.0.0.1:62001adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043adb shell./data/local/tmp/frida-server再开启cd D:\linuxdir\python\fridapython main.py下载夜神模拟 https://www.yeshen.com/ 安装adb 点击下载adb&#xff08…

编程与数学 03-002 计算机网络 14_网络性能分析

编程与数学 03-002 计算机网络 14_网络性能分析一、网络性能指标&#xff08;一&#xff09;带宽、时延、吞吐量等指标的定义与测量方法&#xff08;二&#xff09;性能指标对网络应用的影响二、网络性能的测试方法&#xff08;一&#xff09;使用网络测试工具&#xff08;如Wi…