Serilog日志记录到Sqlserver以及其中存在的问题
电脑版发表于:2019/10/8 13:40
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 { /// <summary> /// 创建全局Logger /// </summary> public static void CreateLogger() { // 这一部分是配置Sql Server的Sink // 数据库连接字符串 string connectionString = Application.GetConfigConnectionString(); // 表名 string tableName = Application.GetConfigLogTableString(); // 自定义字段 var columnOptions = new ColumnOptions { AdditionalDataColumns = new Collection<DataColumn> { 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(); //}); } /// <summary> /// 刷新全局Logger并提交到数据库 /// </summary> 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();方法即可实现,不然光建立好了表数据不会到达数据库