尘叶心繁

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();方法即可实现,不然光建立好了表数据不会到达数据库




关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢