1. 概述
- Serilog 是一個用於.NET應用程序的日志記錄開源庫,配置簡單,接口干凈,並可運行在最新的.NET平台上,與其他日志庫不同, Serilog 是以功能強大的結構化事件數據為基礎構建的, 支持將日志輸出到控制台、文件、數據庫和其它更多的方式,支持參數化日志模板,非常靈活
- Serilog使用Json格式來記錄應用程序中的事件,方便快速查詢、過濾日志
- Serilog 架構
- Serilog:Serilog核心庫
- Sinks:事件接收器,通過事件接收器將日志寫入到各種終端、文件、郵件、數據庫或日志服務器,下面介紹常用的Sinks
- Serilog.Sinks.Debug:將日志事件寫入調試的輸出窗口
- Serilog.Sinks.Console:將Serilog事件寫入控制台/終端
- Serilog.Sinks.File:將Serilog事件寫入文本文件
- Serilog.Sinks.Http:將Serilog事件輸出到REST服務
- Serilog.Sinks.MongoDB:將日志事件寫入MongoDB
- Serilog.Sinks.EventLog:將日志事件寫入系統事件中
- Serilog.Sinks.MSSqlServer:將日志事件寫入SQLServer
- Serilog.Sinks.ElasticSearch:將日志事件寫入ES
- Serilog.Sinks.Email:將日志事件已Email的方式發送
- Serilog.Sinks.RabbitMQ:將日志事件寫入RabbitMQ
2. 快速開始
- 創建.Net Consul項目(Core/Framework)
- 從NuGet安裝:支持的平台是.NET/.NET Core,.NET Framework 4.5 +,Windows(8 / WinRT / Universal +)和Windows Phone 8 +
$ dotnet add package Serilog $ dotnet add package Serilog.Sinks.Console
- 在Program類中引用Serilog命名空間
using Serilog;
- 在Mian函數中創建Serilog對象,並選擇輸出到控制台
using Serilog; namespace Hello { internal class Program { static void Main(string[] args) { using var log = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); //在程序退出前釋放Log log.CloseAndFlush(); } } }
- 輸出日志
using Serilog; namespace Hello { internal class Program { static void Main(string[] args) { using var log = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); log.Information("Hello, Serilog!"); log.CloseAndFlush(); } } }
- 一般情況下,在整個應用程序中使用一個ILogger對象,在首次啟動時完成初始化即可
using Serilog; namespace Hello { internal class Program { static void Main(string[] args) { using var log = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); Log.Logger = log; Log.Information("Hello, Serilog!"); Log.CloseAndFlush(); } } }
3. Serilog Event And Level
- 與log4net相比,在使用Serilog時需要做的最大的改變是在思維方式上考慮的是事件而不是日志消息,一個事件有以下幾個部分組成
- 事件發生的時間:Timestamp
- 事件的級別:Level
- 事件的消息內容:Message
- 事件的屬性:Properties
- 可能還有一個對象:Exception
- 例如
- 將日志事件輸出到控制台
[11:06:08 INF] Hello,Serilog
- 或者將事件格式化為JSON發送到遠程服務器
{"@t":"2021-12-20T11:33:01.22138","@m":"Hello, Serilog!"}
- 在后台應用程序創建LogEvent對象,連接到管道的接收器(Sinks)去處理
- 將日志事件輸出到控制台
- 事件級別
級別 說明 Verbos 第一級,記錄詳細的堆棧日志 Debug 第二級,記錄調試日志 Information 第三級,記錄程序執行日志 Warning 第四級,記錄程序運行的警告日志 Error 第五級,記錄程序運行的錯誤日志 Fatal 第六級,記錄程序運行中發生致命錯誤的日志
4. Asp.Net Core Web API記錄文本日志
- 安裝NuGet
$ dotnet add package Serilog $ dotnet add package Serilog.AspNetCore $ dotnet add package Serilog.Sinks.Async //異步接收器 $ dotnet add package Serilog.Sinks.File
- 配置Serilog
- 在程序入口Program類的Main函數創建Log接收器對象
public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() //定義日志記錄級別 .MinimumLevel.Verbose() //配置異步接受,將日志輸出到文本文件並設置日志的輸出格式 .WriteTo.Async(config => config.File($"{AppContext.BaseDirectory}logs/.log", LogEventLevel.Error, rollingInterval: RollingInterval.Day, outputTemplate: "{Timestamp:HH:mm} || {Level} || {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")) .CreateLogger(); CreateHostBuilder(args).Build().Run(); }
- 在程序入口Program類的IHostBuilder函數啟用Serilog
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) //啟用Serilog .UseSerilog() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
- 在appsettings.json中替換默認的Log配置
"Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "System": "Warning", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore": "Information" } } }
- 配置完成后運行程序即可查看記錄的文本日志
- 在程序入口Program類的Main函數創建Log接收器對象
LogDashboard
-
概述
- 項目使用Serilog記錄日之后,使用記事本或者SQL查看日志不是很直觀和方便,LogDashboard提供了一個快速查看日志的面板
- LogDashboard適用於aspnetcore 2.x - aspnetcore5.x 以及后續的6.x項目, 采用aspnetcore中間件技術開發. 輕量快速
-
功能概覽
- 首頁:實時查看應用程序運行中產生的日志
- 日志聚合
- 趨勢圖表
- 最近十條日志
- 列表:復合檢索所有日志並查看詳情等操作
- 首頁:實時查看應用程序運行中產生的日志
-
特性
- 授權訪問
- 自定義日志模型
- 日志追蹤
- 堆棧查看
-
支持的日志組件
- nlog
- log4net
- serilog
-
集成Serilog
- 安裝LogDashboard
Install-Package LogDashboard
- 打開Startup.cs,在ConfigureServices方法中注冊服務,並配置訪問權限
public void ConfigureServices(IServiceCollection services) { services.AddLogDashboard(options => { options.AddAuthorizationFilter(new LogDashboardBasicAuthFilter("admin", "pass01!")); }); }
- 在Configure方法中配置中間件
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseLogDashboard(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); }
- 運行項目導航到/logdashboard
- 安裝LogDashboard