.Net Core项目中整合Serilog
前言:Serilog是.NET应用程序的诊断日志记录库。它易于设置,具有简洁的API,并且可以在所有最新的.NET平台上运行。尽管即使在最简单的应用程序中它也很有用,但当对复杂的,分布式的和异步的应用程序和系统进行检测时,Serilog对结构化日志记录的支持便会更加出色。
首先导入要用到的NuGet包:
#region 这两个包是引入Serilog的关键 Serilog Serilog.AspNetCore #endregion //控制台输出 Serilog.Sinks.Console //发送邮件 Serilog.Sinks.Email //将日志写入到文件 Serilog.Sinks.File //推送日志至数据库 Serilog.Sinks.MssqlServer
1.输出到控制台
public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Information()//最小的记录等级 .MinimumLevel.Override("Microsoft", LogEventLevel.Information)//对其他日志进行重写,除此之外,目前框架只有微软自带的日志组件 .WriteTo.Console()//输出到控制台 .CreateLogger(); Log.Information("info"); Log.Error("err"); CreateHostBuilder(args).Build().Run(); }
在终端中不同等级的日志颜色不同
Serilog提供了两个类(SystemConsoleThemes和AnsiConsoleThemes)用于主题的变化
.WriteTo.Console(theme: SystemConsoleTheme.Colored)
.WriteTo.Console(theme: AnsiConsoleTheme.Code)
也可以自定义输出的模板
.WriteTo.Console(theme: AnsiConsoleTheme.Code, outputTemplate: "发生时间:{Timestamp: HH:mm:ss.fff} 事件级别:{Level} 详细信息:{Message}{NewLine}{Exception}")
我们也可以将这些配置项写入到appsettings.json文件中
导包:Serilog.Settings.Configuration
在appsettings.json加入以下json块儿
"Serilog": { "WriteTo": [ { "Name": "Console", "Args": { "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console", "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}" } } ] }
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build()) .CreateLogger();
2.将日志写入到文件
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build()) .WriteTo.File(Path.Combine("MyLogs", "log"), rollingInterval: RollingInterval.Day)//文件生成到当前路径 rollingInterval:RollingInterval.Day:按天生成文件 .CreateLogger();
将配置信息添加到json中
"Serilog": { "WriteTo": [ { "Name": "Console", "Args": { "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console", "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}", } }, { "Name": "File", "Args": { "path": "MyLogs/log.txt", "rollingInterval": "Day", "outputTemplate": "发生时间:{Timestamp: HH:mm:ss.fff} 事件等级:{Level} 详细信息:{Message}{NewLine}{Exception}" } } ] }
将这句代码注释掉:.WriteTo.File(Path.Combine("MyLogs", "log"), rollingInterval: RollingInterval.Day)
3.将日志推送到数据库
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build()) .WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。 .CreateLogger();
4.发送邮件
.WriteTo.Email(new EmailConnectionInfo() { EmailSubject = "系统警告,请速速查看!",//邮件标题 FromEmail = "291***@qq.com",//发件人邮箱 MailServer = "smtp.qq.com",//smtp服务器地址 NetworkCredentials = new NetworkCredential("291***@qq.com", "###########"),//两个参数分别是发件人邮箱与客户端授权码 Port = 587,//端口号 ToEmail = "183***@163.com"//收件人 })
如果对客户端授权码不熟悉的同学可移步此博客
https://www.cnblogs.com/zhangnever/p/11926020.html
发送成功!
完整代码:
public class Program { public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build()) .WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。 .WriteTo.Email(new EmailConnectionInfo() { EmailSubject = "系统警告,请速速查看!",//邮件标题 FromEmail = "291***@qq.com",//发件人邮箱 MailServer = "smtp.qq.com",//smtp服务器地址 NetworkCredentials = new NetworkCredential("291***@qq.com", "###########"),//两个参数分别是发件人邮箱与客户端授权码 Port = 587,//端口号 ToEmail = "188***@163.com"//收件人 }) .CreateLogger(); Log.Information("info"); Log.Error("err"); CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseSerilog()//在宿主机启动的时候配置serilog,与微软ILogger进行整合 .UseStartup<Startup>(); }); }
我们在用的时候可以直接在控制器中注入ILogger
例如微软的天气预报的控制器:
private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; }
//直接在接口中使用: _logger.LogInformation("success");
最好配合过滤器一起使用,达到AOP的效果
请看此篇博客:
https://www.cnblogs.com/zhangnever/p/12397117.html
其实Serilog还有N多插件,我只列举了以上几个。
以后慢慢了解吧!
🙂
作者:江北
出处:https://www.cnblogs.com/zhangnever/p/12459399.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
微信:CodeDoraemon
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?