Serilog
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