.NET项目重构之日志服务(Serilog)

这篇具有很好参考价值的文章主要介绍了.NET项目重构之日志服务(Serilog)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 目录

  • 1. 目录
  • 2. 前言
    • 2.1. 日志控件的选择
  • 3. 日志配置
    • 3.1. 控制台打印
    • 3.2. 文件打印
  • 4. 结语

2. 前言

定时任务中比较重要的一个环节就是日志记录,有了日志可以记录系统的操作过程,也可以在系统异常时方便排查错误原因。

比如定时任务经常要做的一个事情,同步其它异构系统数据到本系统。大多情况下的操作过程时,定时请求对方接口返回JSON格式数据,我方把接收到的数据再转换为C#对象进行业务处理后保存至数据库。如果在这个过程中发生系统异常,没有日志记录很有可能连复现BUG都很难做到。

所以在这个过程中,比较正确的日志记录方式是:

  1. 接口请求,如有异常记录日志。
  2. 记录接口返回值。
  3. JSON数据转换为C#对象,如有异常记录日志。
  4. 其它

2.1. 日志控件的选择

之前所有项目用的基本都是老牌Log4net,而这次重构的一大主题是学习新东西嘛,所以我选择比较年轻一点的Serilog。

为什么选择Serilog? 嗯。。。。随便选的,其实用NLog也不是不行。

3. 日志配置

在Web项目下创建Extensions文件夹并添加SerilogSetup.cs文件。

添加如下NuGet包

  • Serilog 3.0.1 基础包
  • Serilog.Extensions.Hosting 7.0.0 ConfigureHostBuilder的扩展包
  • Serilog.Enrichers.Thread 3.1.0 用于获取线程信息
  • Serilog.Sinks.Async 1.5.0 用于异步打印
  • Serilog.Sinks.Console 4.1.0 打印日志到控制台
  • Serilog.Sinks.File 5.0.0 打印日志到文件

添加全局静态变量,用于设置打印模板,至于写法。官网是最好的老师:https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates

    private static readonly string logTemplate = "{NewLine}时闻:{Timestamp:yyyy-MM-dd HH:mm:ss.fff}{NewLine}日志等级:{Level}{NewLine}线程ID:{ThreadId} 线程名:{ThreadName}{NewLine}所在类:{SourceContext}{NewLine}日志信息:{Message}{NewLine}{Exception}";

3.1. 控制台打印

接着添加静态方法AddSerilog

    public static void AddSerilog(ConfigureHostBuilder builder)
    {
         // 打印到控制台
         // 生产环境中可以不向控制台打印
         builder.UseSerilog((context, logger) =>
         {
             // 添加此句后可以在“执行上下文”中动态添加和删除属性
             logger.Enrich.FromLogContext();

             logger.MinimumLevel.Information();
             logger.Enrich.WithThreadId();
             logger.Enrich.WithThreadName();

             logger.WriteTo.Logger(lg => lg.WriteTo.Async(a =>
                     a.Console(outputTemplate: logTemplate)));
         });
    }

3.2. 文件打印

在AddSerilog方法中添加如下内容

   // 打印到文件
   builder.UseSerilog((context, logger) =>
   {
       logger.Enrich.FromLogContext();
       logger.Enrich.WithThreadId();
       logger.Enrich.WithThreadName();

       logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Debug).WriteTo.Async(a => a.File(logDebug, rollingInterval: RollingInterval.Hour, outputTemplate: logTemplate)));
       logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Information).WriteTo.Async(a => a.File(logInfo, rollingInterval: RollingInterval.Hour, outputTemplate: logTemplate)));
       logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Warning).WriteTo.Async(a => a.File(logWarn, rollingInterval: RollingInterval.Hour, outputTemplate: logTemplate)));
       logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Error).WriteTo.Async(a => a.File(logError, rollingInterval: RollingInterval.Hour, outputTemplate: logTemplate)));
       logger.WriteTo.Logger(lg => lg.Filter.ByIncludingOnly(p => p.Level == LogEventLevel.Fatal).WriteTo.Async(a => a.File(logFatal, rollingInterval: RollingInterval.Hour, outputTemplate: logTemplate)));

   });

这里要注意的是,也可以写在一个方法内,我这样做的目的是为了可以一目了然的区分开不同日志的配置。

最后在Program.cs 中注册Serilog相关配置。

SerilogSetup.AddSerilog(builder.Host);

接下来就可以找个地方做打印测试了,比如在HomeController的Index的方法中加放入

    _logger.LogInformation("控制台打印");

4. 结语

目前阶段只是做了控制台和文件打印,以后也许会接入数据库打印。

因为后期想在Web页面查看定时任务的执行状况等等。文章来源地址https://www.toymoban.com/news/detail-602651.html

到了这里,关于.NET项目重构之日志服务(Serilog)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(66)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(55)
  • .NET 日志系统-3 结构化日志和集中日志服务

    认识.NET 日志系统 https://www.cnblogs.com/ZYPLJ/p/17663487.html .NET 认识日志系统-2 https://www.cnblogs.com/ZYPLJ/p/17667970.html 结构化日志比普通文本更利于日志的分析,结构化日志的格式为json格式。 NLog也可以配置结构化日志,不过配置麻烦,推荐用Serilog。 NuGet安装:Serilog.AspNetCore 要记录的

    2024年02月10日
    浏览(40)
  • .net core 生成项目时.json配置文件没有复制到输出目录

    在程序运行时默认加载.exe文件同文件夹下的配置文件,而不是项目中的.json配置文件,所以需要把.json配置文件设置到自动生成目录,即下图所示:

    2023年04月13日
    浏览(55)
  • 基于scrcpy的Android群控项目重构,集成Appium服务执行自动化测试用例

    基于scrcpy的Android群控项目重构 基于scrcpy的Android群控项目重构 进阶版 基于scrcpy的Android群控项目重构,获取Android屏幕元素信息并编写自动化事件(视频) 基于scrcpy的Android群控项目重构,获取Android屏幕元素信息并编写自动化事件(博客) 基于scrcpy的Android群控项目重构,集成

    2024年02月16日
    浏览(51)
  • nginx上web服务的基本安全优化、服务性能优化、访问日志优化、目录资源优化和防盗链配置简介

    目录 一.基本安全优化 1.隐藏nginx软件版本信息 2.更改源码来隐藏软件名和版本 (1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改 (2)第二个文件 (3)第三个文件,内置响应信息页面 (4)第四个文件 (5)重新编译安装并重启 3.更改nginx服务的默

    2024年02月13日
    浏览(43)
  • 【ASP.NET Core】使用SignalR推送服务器日志

    一个多月前接手了一个产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API。由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动。经过我近一个月的改造,除了保留业务逻辑代码,其他的基本重写。如今上位机的启动

    2024年02月03日
    浏览(57)
  • Rx.NET in Action 中文介绍 前言及序言

    目标 可选方式 Rx 处理器(Operator) 创建 Observable Creating Observables 直接创建 By explicit logic Create Defer 根据范围创建 By specification Range Repeat Generate Timer Interval Return 使用预设 Predefined primitives Throw Never Empty 从其他类型创建 From other types FromEventPattern FromEvent FromTask FromAsync 变换 Transform

    2024年02月13日
    浏览(48)
  • 【实战分享】使用 Go 重构流式日志网关

    分享之前,先来简单介绍下该项目在流式日志处理链路中所处的位置。 流式日志网关的主要功能是提供 HTTP 接口,接收 CDN 边缘节点上报的各类日志(访问日志/报错日志/计费日志等),将日志作预处理并分流到多个的 Kafka 集群和 Topic 中。 越来越多的客户要求提供实时日志

    2024年02月08日
    浏览(43)
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-2】 - 配置管理-Mvc【含请求日志打印】

    继上篇:Taurus .Net Core 微服务开源框架:Admin 插件【4-1】 - 配置管理-Kestrel【含https启用】 本篇继续介绍下一个内容: 界面如图: 以下为配置说明: 控制 Taurus 的 Mvc 是否启用,比如网关、或注册中心,或者使用其它Mvc框架,可以选择不启用。 如正常访问Mvc时: 禁用它后:

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包