火影推荐程序连载52-什么是Serilog?

2023-05-16

上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mongodb进行存储日志,那就是完美的结合,MongoDB也是文档式数据库,存储的格式很像JSON,也可以它是一个JSON文件,查询数据库快。不扯远了,还是讲讲Serilog的使用吧!

一、什么是Serilog?

Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录。Serilog 有各种可用的接收器,例如,有纯文本、SQL 和 ElasticSearch 接收器等等。

二、如何安装Serilog?

Install-Package Serilog.AspNetCore

三、如何配置Serilog?

3.1Program的配置如下

  • Configuration:构建对象,读取appsettings.json的配置文件
  • Log.Logger:读取Configuration中的日志配置信息,然后设置输出的级别、内容、位置等。
  • UseSerilog(dispose:true):引入Serilog框架,dispose:true=>系统退出时,释放日志对象
   public class Program
    {
        public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())//设置基础路径
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)//添加配置文件
            .AddEnvironmentVariables()//添加环境变量
            .Build();

        public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration)
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()//使用Serilog.Context.LogContext中的属性丰富日志事件。
                .WriteTo.Console(new RenderedCompactJsonFormatter())//输出到控制台
                .WriteTo.File(formatter:new CompactJsonFormatter(),"logs\\test.txt",rollingInterval:RollingInterval.Day)//输出到文件
                .CreateLogger();//清除内置日志框架

            try
            {
                Log.Information("Starting web host");
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex,"Host terminated unexpectedly");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args).
                .ConfigureWebHostDefaults(webBuilder =>{
                    webBuilder.UseStartup<Startup>();
                }).UseSerilog(dispose:true);//引入第三方日志框架
    

3.2 appsettings.json配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Information"
      }
    }
  }
}

四、如何使用Serilog?

因为是替换了.net core中的内部日志框架,所有在使用的时候,和Logging日志框架一样使用,如下图所示

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public void Get()
        {
            _logger.LogInformation("LogInformation" + Guid.NewGuid().ToString("N"));
            _logger.LogDebug("LogDebug" + Guid.NewGuid().ToString("N"));
            _logger.LogWarning("LogWarning" + Guid.NewGuid().ToString("N"));
            _logger.LogError("LogError" + Guid.NewGuid().ToString("N"));
        }

五、展示效果

控制台显示

文件显示

六、扩展

6.1分级别显示

  //存储日志文件的路径
  string LogFilePath(string LogEvent) => $@"{AppContext.BaseDirectory}00_Logs\{LogEvent}\log.log";
  //存储日志文件的格式
  string SerilogOutputTemplate = "{NewLine}{NewLine}Date:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}LogLevel:{Level}{NewLine}Message:{Message}{NewLine}{Exception}" + new string('-', 50);

   Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration)
                .MinimumLevel.Debug()
                .Enrich.FromLogContext()//使用Serilog.Context.LogContext中的属性丰富日志事件。
                .WriteTo.Console(new RenderedCompactJsonFormatter())
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.File(LogFilePath("Debug"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.File(LogFilePath("Information"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.File(LogFilePath("Warning"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.File(LogFilePath("Error"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
                .WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.File(LogFilePath("Fatal"), rollingInterval: RollingInterval.Day, outputTemplate: SerilogOutputTemplate))
                .CreateLogger();

效果如下:
文件级别分类:

日志格式输出:

6.2存储到数据库

Install-Package Serilog.Sinks.MSSqlServer

修改配置
MSSqlServer(参数一,参数二,参数三,参数四)

  • 数据库的地址
  • 数据库中记录日志表的名称
  • 是否自动创建表(Nlog是没有这个功能的)
  • 记录日志最小级别

            Log.Logger =  new LoggerConfiguration().ReadFrom.Configuration(Configuration)
                 .MinimumLevel.Information()
                 .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                 .ReadFrom.Configuration(new ConfigurationBuilder()
                 .AddJsonFile("appsettings.json")
                 .Build())
                 .WriteTo.MSSqlServer(connecting, "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)
                 .CreateLogger();

效果如下:

6.2.1数据库中表字段

新增
第一步:创建列

  var options = new ColumnOptions();
            options.AdditionalColumns = new Collection<SqlColumn>
                {
                    new SqlColumn { DataType = SqlDbType.NVarChar, DataLength =-1, ColumnName = "IP" },
                };

第二步:添加列
Enrich.WithProperty:添加属性
columnOptions: options:配置数据库的列

  Log.Logger =  new LoggerConfiguration().ReadFrom.Configuration(Configuration)
                 .MinimumLevel.Information()
                 .Enrich.WithProperty("IP", "2.2.2.2")
                 .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                 .ReadFrom.Configuration(new ConfigurationBuilder()
                 .AddJsonFile("appsettings.json")
                 .Build())
                 .WriteTo.MSSqlServer(connecting, "logs", autoCreateSqlTable: true, columnOptions: options, restrictedToMinimumLevel: LogEventLevel.Information)
                 .CreateLogger();

第三步:运行即可

移除
第一步:记录移除列
StandardColumn:是框架默认提供数据库默认表,它的属性就是映射数据库的字段

  var options = new ColumnOptions();
            options.Store.Remove(StandardColumn.Properties);
            options.Store.Remove(StandardColumn.TimeStamp);

第二步:配置属性


            Log.Logger =  new LoggerConfiguration().ReadFrom.Configuration(Configuration)
                 .MinimumLevel.Information()
                 .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                 .ReadFrom.Configuration(new ConfigurationBuilder()
                 .AddJsonFile("appsettings.json")
                 .Build())
                 .WriteTo.MSSqlServer(connecting, "logs", autoCreateSqlTable: true, columnOptions: options, restrictedToMinimumLevel: LogEventLevel.Information)
                 .CreateLogger();

第三步:运行即可

注意事项:

当你创建了数据库的表之后,如果修改添加字段或修改字段,数据库存在的表是不会更新的,只能重新创建

6.3发送到邮箱

添加安装包:

Install-Package Serilog.Sinks.Email

配置如下:

 Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                .ReadFrom.Configuration(new ConfigurationBuilder()
  www.dongdongrji.cn maven.apache.org/xsd/maven-4.0.0.xsd">
  
  <artifactId>dubbo<www.xxinyoupt.cn /artifactId>
  
  <groupId>nacos</groupId>
  
  <version>0.0.1-SNAPSHOT<www.lanboyulezc.cn /version>
  
  <priority value=www.lanboylgw.com/"info"www.chuanchenpt.cn/ />
  
  <appender-ref ref=www.yixingxzc.cn"stdout"www.lanboylgw.com />
  
  <appender-ref ref="fileout"www.baichuangyule.cn /
  
  换掉encoder的实现类或者换掉layout的实现类就可以了
  
  <?xml version= www.lanboyulezc.cn www.jiuerylzc.cn"1.0"www.zhuyngyule.cn encoding=www.bhylzc.cn"UTF-8"?>
  
  <configuration debug=www.shicaiyulezc.cn"false"www.huachenguoj.com >
  
  <property name=www.51huayuzc.cn"APP_NAME" value="logtest"/>
  
  <property name=www.xinhuihpw.com "LOG_HOME" value="./logs" www.wanyaylezc.cn//>
  
  <appender name="STDOUT" class="www".yachengyl.cn"ch.qos.logback.core.ConsoleAppender">
  
  <!--替换成AspectLogbackEncoder-->
  
  <encoder class="www.shengrenyp.cn "com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder"www.51huayuzc.cn>
  
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{www.pinguo2yl.com} - %msg%n</pattern>
  
  <appender www.baishenjzc.cn name="FILE" www.baihua178.cn class="ch.qos.logback.core.rolling.RollingFileAppender">
  
  <File>${LOG_HOME}/${APP_www.jinliyld.cn NAME}.log<www.baihua178.cn /File>
  
  <rollingPolicy class="www.jintianxuesha.com"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"www.wanyaylezc.cn/>
  
  <FileNamePattern>www.yachengyl.cn ${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
  
  <MaxHistory>30<www.51huayuzc.cn /MaxHistory>
  
  <maxFileSize>1000MB<www.jinliyld.cn /maxFileSize>
                .WriteTo.Email(new EmailConnectionInfo() { 
                    Port= 465,//端口
                    EmailSubject="邮件日志测试",//邮件主题
                    FromEmail= "18827664385@163.com",//发件箱
                    ToEmail="282840325@qq.com",//收件箱
                    MailServer= "smtp.163.com",//发件箱的邮箱服务
                    NetworkCredentials = new NetworkCredential("18827664385@163.com", "zc960810"),//发件人的邮箱和密码
                    IsBodyHtml =true,//邮件是否是HTML格式
                    EnableSsl=true//使用启用SSL端口
                })
                .CreateLogger();

效果如下

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

火影推荐程序连载52-什么是Serilog? 的相关文章

随机推荐

  • Ubuntu设置sudo免密码

    步骤1 xff1a 使用su命令切换至root用户 在终端中输入以下命令 xff1a sudo su 输入当前用户的密码 xff0c 即可切换至root用户 步骤2 xff1a 使用如下命令修改sudoers文件权限 在终端中输入以下命令
  • log4j2 使用详解

    转载自 Blog of 天外的星星 xff1a http www cnblogs com leo lsw p log4j2tutorial html Log4j 2的好处就不和大家说了 xff0c 如果你搜了2 xff0c 说明你对他已经有
  • 基于webpack实现多html页面开发框架八 html引入图片打包和公共页面模块复用

    一 解决什么问题 1 html中img引入的图片地址没有被替换 xff0c 找不到图片 2 html公共部分复用问题 xff0c 如头部 底部 浮动层等 二 html中img引入图片问题解决 1 在index html插入img xff0c
  • 程序员入门编程,看这10本书,少走10年弯路

    如果能时光倒流 xff0c 回到过去 xff0c 作为一个开发人员 xff0c 你可以告诉自己在职业生涯初期应该读一本 xff0c 你会选择哪本书呢 xff1f 我希望这个书单列表内容丰富 xff0c 可以涵盖很多东西 高尔基曾说 书是人类
  • 编译vs2008的samples程序总是跳过

    编译vs2008的samples程序总是跳过 xff0c 要配置属性还显示 未能完成操作 未指定的错误 的解决办法 作者 admin 分类 开发问题 发布时间 2013 03 12 09 22 974 浏览数 6 没有评论 文章转自王牌软件
  • 二叉排序树的删除

    xff08 网上讲二叉排序树删除的资料很少 xff0c 这篇很不错 xff01 转自 xff1a http bbs csdn net topics 110010437 xff09 二叉排序树的删除 xff1a 对于一般的二叉树来说 xff0
  • MFC 用户界面线程:界面线程的退出 窗口关闭的流程

    原文链接 xff1a http wenku baidu com link url 61 6CFkWbLOeFgNoUsJniCX3ksw6 RztxMr9Z e6t7uu3e vV7UTKThUEkyRkq8IXwxIw5qYctN8gIx
  • MFC用户界面多线程实例2

    以下是 MFC 用户界面线程相关知识 由于用户界面线程含有自己的消息循环 xff0c 可以出来 Windows 消息 xff0c 并可创建和管理诸如窗口和控件等用户界面 元素 因此 xff0c 这 种线程较工程线程更为复杂 创建用户界面线程
  • 反汇编定位代码崩溃位置_1

    原帖 xff1a http blog csdn net gwzz1228 article details 9045853 利用map xff0c cod文件定位崩溃代码行 利用vs2010 新建一个空的控制台项目 xff0c 添加文件gtg
  • 反汇编定位代码崩溃位置_3

    原帖 xff1a http blog sina com cn s blog 141f234870102van8 html win7 43 vs2010通过map文件和cod文件找到崩溃的代码行 2015 01 11 11 31 04 转载
  • 反汇编定位代码崩溃位置_4

    原帖 xff1a http blog csdn net xiao article details 23177577 GDB如何从Coredump文件恢复动态库信息 标签 xff1a GDBcoredumpso调试动态库 2014 04 08
  • C链表反转

    节点 struct Note int value Note pNext typedef struct Note PList 生成一个链表 Note GenerateList 输出一个链表 void PrintList Note pHead
  • FtpClient.storeFile返回false解决方法

    今天在利用FTP将客户端文件存储到服务器端时 xff0c 在调用ftpClient storeFile方法后 xff0c 总是返回false xff0c 在百度之后 xff0c 有提到说添加一行 ftpClient enterLocalPa
  • 压缩软件介绍

    压缩软件介绍 一 xff0e 关于WINRAR压缩 ZIP 1 最大优点就是普及率 2 相对RAR格式来说它的压缩速度会要快一些 RAR 1 对比ZIP来说RAR是一次长足的进步 它能够提供更好的压缩比率 2 支持固实压缩模式 对存在很多重
  • ubuntu 使用MobaXterm和cpolar配置外网访问ssh和vnc

    目录 1 首先下载MobaXterm xff1a mobaxterm 2 注册并在ubuntu服务器上安装cpolar xff1a cpolar 安装说明 xff1a 3 保留固定TCP地址 xff08 此步骤可跳过 xff0c 但需要每天
  • copy-webpack-plugin HookWebpackError: Not supported

    前言 运行项目时 xff0c 控制台报错 HookWebpackError Not supported 定位问题发现与 copy webpack plugin 相关 本文主要记录下解决方案 一 控制台报错 二 copy webpack pl
  • 字符串子串的查找

    1 考虑用标准函数库中 strstr 函数 包含文件 xff1a string h 函数名 strstr 函数原型 xff1a extern char strstr char str1 char str2 功能 xff1a 从字符串str1
  • Ubuntu20.04下,搭建hexo个人博客

    一些说明和资源 所使用到的软件版本 xff1a UbuntuNginxGithexo20 04 LTS1 18 02 25 15 4 0 其他说明 xff1a 这里所演示的是在 VirtualBox 中进行的 xff0c 实际工作场景可以是
  • **打开virt-manager报错:** (virt-manager:6079): Gtk-WARNING **: 19:57:38.863: cannot open display:

    打开virt manager报错 virt manager 6079 Gtk WARNING 19 57 38 863 cannot open display 安装 xorg x11 font utils包后可以正常打开 xff1a roo
  • 火影推荐程序连载52-什么是Serilog?

    上文说到Nlog日志框架 xff0c 感觉它功能已经很强大 xff0c 今天给大家介绍一个很不错的日志框架Serilog xff0c 根据我的了解 xff0c 感觉它最大的优势是 xff0c 结构化日志 xff0c 它输出的日志是Json的