首页 > 编程语言 >C# 使用Serilog日志框架

C# 使用Serilog日志框架

时间:2022-11-26 17:46:55浏览次数:41  
标签:Log C# WriteTo Serilog Debug 日志 log

Serilog是一款配置方便,使用灵活的日志框架,使用方法如下:
1、日志输出到控制台,需要使用Nuget安装Serilog和Serilog.Sinks.Console两个包

            // 初始化日志的共享实例
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                .WriteTo.Console()
                .CreateLogger();
            // 写入日志
            Log.Information("Info");

2、日志输出到文件,需要安装Serilog.Sinks.File包

            // 初始化日志的共享实例
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                .WriteTo.File("logs/app.log", 
                    rollingInterval: RollingInterval.Day, // 每天一个日志文件
                    shared: true    // 允许其他进程共享日志文件
                ).CreateLogger();
            // 写入日志
            Log.Information("Info");

3、可以通过配置,让不同日志级别输出到不同的日志文件

       // 初始化日志的共享实例
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                // 调试日志
                .WriteTo.Logger(x => x
                    .Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Debug)
                    .WriteTo.File("logs/debug.log", rollingInterval: RollingInterval.Day, shared: true)
                // 错误日志
                ).WriteTo.Logger(x => x
                    .Filter.ByIncludingOnly(e => e.Level == Serilog.Events.LogEventLevel.Error)
                    .WriteTo.File("logs/error.log", rollingInterval: RollingInterval.Day, shared: true)
                // 应用日志
                ).WriteTo.Logger(x => x
                    .Filter.ByIncludingOnly(e => e.Level != Serilog.Events.LogEventLevel.Debug &&
                        e.Level != Serilog.Events.LogEventLevel.Error)
                    .WriteTo.File("logs/app.log", rollingInterval: RollingInterval.Day, shared: true)
                ).CreateLogger();
            // 写入日志到 app.log
            Log.Information("Info");
            // 写入日志到 debug.log
            Log.Debug("Debug");
            // 写入日志到 error.log
            Log.Error("Error");

4、写入日志到SqlServer

            // 写入数据库的配置
            var sinkOpts = new MSSqlServerSinkOptions();
            sinkOpts.TableName = "logs";            // 日志表名
            sinkOpts.AutoCreateSqlTable = true;     // 自动创建表
            // 列配置
            var columnOpts = new ColumnOptions();
            columnOpts.Store.Remove(StandardColumn.Exception);  // 去掉异常列
            columnOpts.Store.Remove(StandardColumn.Properties); // 去掉属性列
            columnOpts.Exception.DataLength = 2048;             // 指定列的长度
            columnOpts.TimeStamp.NonClusteredIndex = true;      // 去掉时间戳的聚集索引
            // 初始化日志的共享实例
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()
                .WriteTo.MSSqlServer(
                        connectionString: ConfigurationManager.ConnectionStrings["Default"].ConnectionString,
                        sinkOptions: sinkOpts,
                        columnOptions: columnOpts
                 ).CreateLogger();
            // 写入日志
            Log.Information("Info");

执行代码后,发现日志表并没有添加到数据库,也没有任何异常信息,我们可以添加以下代码调试Serilog

            Serilog.Debugging.SelfLog.Enable(msg =>
            {
                Debug.Print(msg);
                Debugger.Break();
            });

获取到如下的错误信息:

2022-11-26T09:34:53.6107406Z Unable to write 1 log events to the database due to following error: A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。)

需要在连接字符串添加信任服务器证书的配置:TrustServerCertificate=True;

就能在SqlServer中创建日志表并写入日志。

标签:Log,C#,WriteTo,Serilog,Debug,日志,log
From: https://www.cnblogs.com/lgyup/p/16927874.html

相关文章

  • go专家编程--数据结构chan
    chan结构typehchanstruct{ qcount uint//队列中剩余元素大小 dataqsiz uint//队列大小 buf unsafe.Pointer//环......
  • linux重置core文件生成目录
    查看/proc/sys/kernel/core_pattern文件或kernel.core_pattern里面的内容默认是core,也就是core文件的生成路径和工作路径一致,如果内容为其他值,那么对应的core文件就会生成......
  • ECMAScript 2022 & Temporal All In One
    ECMAScript2023&TemporalAllInOneES14/ES2023ES2015=>ES6...ES2022=>ES13ES2023=>ES14https://caniuse.com/sr_es13https://caniuse.com/sr_......
  • Introduction to Computer Science #Homework 06
    IntroductiontoComputerScienceHomework061.程序是如何执行的3.2.1给寄存器R赋值20CPU将寄存器R中的值存回a所在的地址3.2.2将主存中1200地址处的值读取到寄......
  • ECMAScript 2022 & Top-level await All In One
    ECMAScript2022&Top-levelawaitAllInOneES2022/ES13https://caniuse.com/sr_es13Top-levelawaithttps://caniuse.com/mdn-javascript_operators_await_......
  • CentOS 7安装部署禅道
    1.查看Linux服务器版本信息#cat/etc/redhat-releaseCentOSLinuxrelease7.4.1708(Core) 2.禅道开源版安装包下载wget http://dl.cnezsoft.com/zentao/9.8.2/......
  • Codeforces Round #825 (Div. 2)
    A核心思路:这题的第一反应是直接统计a所有的0的数目和b所有的0的数目,然后两式相减。但是我们会发现一个问题,因为有些是可能不需要排序的,所有还有记录下a和b所有不同的个数......
  • 如何扩展 Mac mini 2018 内存条 All In One
    如何扩展Macmini2018内存条AllInOne升级Macmini(2018年)的内存https://support.apple.com/en-us/HT205041#onehttps://support.apple.com/zh-cn/HT205041#on......
  • spring boot整合spring security 前后端分离
    1.springsecurity的介绍springsecurity是一个安全管理框架,源自Spring家族,可以和Spring框架无缝整合。其主要功能有:认证也就是你进行访问一些网站的时候需要进行......
  • ApClient的配置
    设置Channel与上级路由相同iwprivra0setChannel=xx重要ifconfigapcli0up按照加密方式分为以下4种1.OPEN/NONEiwprivapcli0setApCliEnable=0iwprivapcli0setApC......