目錄
一、目的
二、解決方案
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 和可插拔的輸出器及格式化器,使得開發者能夠輕松定制和擴展日志記錄功能。同時在學習新的技術的過程中,建議大家可以多看看源代碼,很多網絡上的內容可能環境和版本不同,不一定完全跑的通。共勉!