1.首先来一大串的安装
Install-Package Serilog
//控制台输出
Install-Package Serilog.Sinks.Console
//文件输出
Install-Package Serilog.Sinks.File
//除了上面的 vs输出
Install-Package Serilog.Sinks.Debug
//改变文件输出格式包
Install-Package Serilog.Sinks.RollingFile
//数据库输出
Install-Package Serilog.Sinks.MSSqlServer
2.封装Logger类
public class SerilogConfiguration
{
///
/// 创建全局Logger
///
public static void CreateLogger()
{
// 这一部分是配置Sql Server的Sink
// 数据库连接字符串
string connectionString = Application.GetConfigConnectionString();
// 表名
string tableName = Application.GetConfigLogTableString();
// 自定义字段
var columnOptions = new ColumnOptions
{
AdditionalDataColumns = new Collection
{
new DataColumn {DataType = typeof (string), ColumnName = "User"},
new DataColumn {DataType = typeof (string), ColumnName = "Class"},
}
};
// Sql Server的表中加入Json格式Log Event的数据字段
//columnOptions.Store.Add(StandardColumn.Level);
// 输出模板,Sql Server不能用这个
const string outputTemplate = "[{Timestamp:HH:mm:ss.FFF} {Level}] {Message} ({SourceContext:l}){NewLine}{Exception}";
Serilog.Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose() // 所有Sink的最小记录级别
.Enrich.WithProperty("SourceContext", null) //加入属性SourceContext,也就运行时是调用Logger的具体类
//.Enrich.FromLogContext() //动态加入属性,主要是针对上面的自定义字段User和Class,当然也可以随时加入别的属性。
.WriteTo.Debug(
outputTemplate: outputTemplate) // 写到VS Output 窗口
.WriteTo.RollingFile("logs\\{Date}.log", shared: true, restrictedToMinimumLevel: LogEventLevel.Debug,
outputTemplate: outputTemplate) // 写到文件,每天一个,最小记录级别是Debug,文件格式是 yyyyMMdd.log
// 记录到Sql Server,最小级别是Information
.WriteTo.MSSqlServer(connectionString, tableName, columnOptions: columnOptions, autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Debug)
.CreateLogger();
//.net Core 需添加
//Serilog.Debugging.SelfLog.Enable(msg =>
//{
// Debug.Print(msg);
// Debugger.Break();
//});
}
///
/// 刷新全局Logger并提交到数据库
///
public static void ReferenceLogger()
{
Log.CloseAndFlush();
CreateLogger();
}
}
2.测试代码
SerilogConfiguration.CreateLogger();
Log.Logger.Information("Information Test");
SerilogConfiguration.ReferenceLogger();
string User = "Bob";
string TClass = nameof(Program);
using (LogContext.PushProperty("User", User))
using (LogContext.PushProperty("Class", TClass))
{
Log.Logger.Error("Error Test {UserType}", User, TClass);
Log.Logger.Warning("Warning Test");
}
SerilogConfiguration.ReferenceLogger();
3.运行结果
4.说明以及遇到的问题
全程只需要你把连接字符串写好,字段加好和 autoCreateSqlTable: true 就可以了,不需要在数据库中创建表结构程序会自动创建
【注意】:想把Serilog写到sqlserver需要调用Log.CloseAndFlush();方法即可实现,不然光建立好了表数据不会到达数据库
欢迎加群讨论技术,群号:677373950