Serilog输出日志到mysql_Serilog日志记录到Sqlserver以及其中存在的问题

本文介绍了如何使用Serilog进行日志管理,包括安装相关包,封装Logger类,设置数据库连接及表名,并详细阐述了自定义字段、输出模板以及日志级别。在测试代码中展示了不同级别的日志记录,并提醒在SQL Server中使用Serilog需调用Log.CloseAndFlush()以确保日志写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.运行结果

e40e3a63e7b1ada7efa96a91fd51b4bd.png

4.说明以及遇到的问题

全程只需要你把连接字符串写好,字段加好和 autoCreateSqlTable: true 就可以了,不需要在数据库中创建表结构程序会自动创建

【注意】:想把Serilog写到sqlserver需要调用Log.CloseAndFlush();方法即可实现,不然光建立好了表数据不会到达数据库

欢迎加群讨论技术,群号:677373950

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值