VEC系列之【Serilog 保姆级教程】
相关NuGet包介绍
Serilog.Extensions.Logging | serilog核心,必要 |
Serilog.Sinks.Async | 支持异步记录日志,很有必要 |
Serilog.Sinks.File | 支持保存到本地,很有必要 |
Serilog.Sinks.MSSqlServer | 支持保存到数据库,有必要的,自带的,比较简单配置 |
Serilog.Sinks.Console | 支持输出到控制台,略有必要(一般可以直接Console) |
注入服务 扩展方法
使用Serilog或者其他组件,Core程序避免不了的就是将其注入到服务中去。日志服务要在构建程序之前就要用Serilog来代替默认自带的ILogger。
public static IHostBuilder AddSerilogSetup(this IHostBuilder host)
{
var logConfiguration = new LoggerConfiguration()
.MinimumLevel.Debug() //最小记录等级
.ReadFrom.Configuration(Appsettings.Configuration) //从给定的配置文件读取信息
.Enrich.FromLogContext()//从上下文中获取信息,自动添加到日志中
.WriteToConsole()//写出到控制台
.WriteToFile()//写出到文件
.WriteToDataBase();//写出到数据库(项目采用雪花ID,serilog自带的生成日志表是自增int不太符合项目,可根据需求选择)
Log.Logger = logConfiguration.CreateLogger();
host.UseSerilog(); //设置Serilog为日志提供者
return host;
}
写出到控制台的扩展方法WriteToConsole
public static LoggerConfiguration WriteToConsole(this LoggerConfiguration configuration)
{
configuration = configuration.WriteTo.Logger(x =>
{
x.Filter.ByExcluding(ExcludingCondition())//过滤掉的内容,我会手动过滤掉不需要的,这个不是必要的。
.Filter.ByExcluding(a => a.Level == LogEventLevel.Debug)//我自己不输出Debug,因为程序自带的Debug记录太多了
.WriteTo.Console();
});
return configuration;
}
写出到文件的扩展方法WriteToFile(分别控制日志等级输出到不同的文件分类,按天滚动)
public static LoggerConfiguration WriteToFile(this LoggerConfiguration configuration)
{
//输出INFO日志
configuration = configuration.WriteTo.Logger(x =>
{
x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Information)
.Filter.ByExcluding(ExcludingCondition())
.WriteTo.Async(s => s.File(LogContextWrite.Combine(@"INFO/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
});
//输出ERROR日志
configuration = configuration.WriteTo.Logger(x =>
{
x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Error)
.Filter.ByExcluding(ExcludingCondition())
.WriteTo.Async(s => s.File(LogContextWrite.Combine(@$"ERROR/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
});
//输出Debug日志
configuration = configuration.WriteTo.Logger(x =>
{
x.Filter.ByIncludingOnly(x => x.Level == LogEventLevel.Debug)
.Filter.ByExcluding(ExcludingCondition())
.WriteTo.Async(s => s.File(LogContextWrite.Combine(@"DEBUG/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
});
//输出Warning日志
configuration = configuration.WriteTo.Logger(x =>
{
x.Filter.ByExcluding(ExcludingCondition())
.WriteTo.Async(s => s.File(LogContextWrite.Combine(@"WARNING/.txt"), rollingInterval: RollingInterval.Day, outputTemplate: LogTemplate));
});
return configuration;
}
写出到数据库的扩展方法WriteToDataBase
public static LoggerConfiguration WriteToDataBase(this LoggerConfiguration configuration)
{
//读取配置文件是否开启数据库日志记录(会自动建表)
if (!Appsettings.AppStr("Seq:EnableWriteToDatabase").ObjToBool())
{
return configuration;
}
//数据库连接字符
var databaseSettings = Appsettings.App<DatabaseSettings>("DatabaseSettings");
var defaultDb = databaseSettings.Db.FirstOrDefault(x => x.Name == databaseSettings.DefaultDb);
configuration = configuration.WriteTo.Logger(x =>
{
//只记录Error,其他的没必要入库。
x.Filter.ByExcluding(l => l.Level != LogEventLevel.Error)
.Filter.ByExcluding(Matching.FromSource("Microsoft"))//过滤掉微软自带的一些日志
.Filter.ByExcluding(ExcludingCondition())
.Filter.ByExcluding(l => l.Properties.ContainsKey("SourceContext") && l.Properties["SourceContext"].ToString().Contains("Quartz.")) // 根据 SourceContext 过滤
.WriteTo.MSSqlServer(defaultDb.ConnectionString, new MSSqlServerSinkOptions
{
AutoCreateSqlTable = true, //自动建表
TableName = Appsettings.AppStr("Seq:WriteToDataBaseTable"), //表名
});
});
return configuration;
}
使用
builder.Host.AddSerilogSetup();