首页 > 其他分享 >.NET项目重构之日志服务(Serilog)

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

时间:2023-07-25 17:24:55浏览次数:35  
标签:lg Serilog WriteTo 打印 NET logger 日志

1. 目录

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页面查看定时任务的执行状况等等。

标签:lg,Serilog,WriteTo,打印,NET,logger,日志
From: https://www.cnblogs.com/hoyu/p/17580343.html

相关文章

  • vb.net 模仿键盘操作
    模仿键盘操作inVB.NET在编写自动化测试、数据录入等任务时,模拟键盘操作是一项非常有用的技术。在VB.NET中,我们可以使用SendKeys类来模仿键盘操作。SendKeys类允许我们向活动窗口发送多个按键和键盘命令,实现模拟键盘输入的效果。本文将介绍SendKeys类的基本使用方法,并提供一些常......
  • 基于 Databend 实现的海量日志实时查询服务 | 多点DMALL
    作者:苏琳多点DMALL供应链补货团队负责人多点DMALL成立于2015年。从创立伊始,就致力于以大数据、云计算、AI等数字技术改变零售业,是一站式全渠道数字零售解决方案服务商,数字化解构重构零售产业,提供端到端的商业SaaS解决方案。多点DMALL通过DMALLOS提供零售云一站式......
  • unable to access 'https://git.oak.net.cn/pigsales/frontend/ai-sales.git/': F
    Git远程仓库无法访问的问题及解决方法在使用Git进行协作开发时,我们经常会遇到无法访问远程仓库的问题。本文将介绍一种常见的错误信息:“unabletoaccess'F”,并提供解决方法。错误信息分析错误信息中的“unabletoaccess”表示无法访问,后面的URL是远程仓库的地址。而最后的“......
  • goaccess日志分析器使用
    一、安装goaccess软件1、安装依赖yum-yinstalllibmaxminddb-develncurses-libsncurses-developensslopenssl-devel2、下载软件wgethttps://tar.goaccess.io/goaccess-1.4.tar.gz3、编译安装tar-xzvfgoaccess-1.4.tar.gz-C/usr/local/cd/usr/local/goaccess-......
  • 记录使用HPSocket.NET包开发WebSocket通讯,报错Could not decode a text frame as UTF-
    因工作需要开发Scada系统,使用到WebSocket通讯,网页客户端接收数据时发生CouldnotdecodeatextframeasUTF-8报错 通过网络检索,有多种说法,验证如下1、文本针和二进制针的数据发送方式都测试失败1stringkson=JsonConvert.Serialize......
  • asp.net core之依赖注入
    依赖注入概念ASP.NETCore支持依赖关系注入(DI)软件设计模式,这是一种在类及其依赖关系之间实现控制反转(IoC)的技术。按照官方文档的描述:依赖关系注入通过以下方式解决了这些问题:使用接口或基类将依赖关系实现抽象化。在服务容器中注册依赖关系。ASP.NETCore提供了一......
  • .Net 项目类型区别 Windows窗体应用程序
    .NET框架(特定于Windows),然后使用WindowsFormsApp(.NETFramework)。Windows窗体应用程序(.NETFramework) 解决方案默认名称:windowsFormsApp.NET核心/.NET(跨平台),然后使用WindowsFormsApp。Windows窗体应用程序  解决方案默认名称:winFormsApp......
  • 通过iptables转发后的端口telnet通但是curl不通的问题
    今天遇到一个问题,一个隔离安全域的服务器需要访问承载网上的gitlab,但是无法直接做互通,所以需要通过iptables转发一次。完成iptables规则后,发现telnet端口是通的但是curlhttp:地址加端口就会返回不通。于是不停的改iptables规则,甚至放行forword规则,最后检查发现是存在外网的代理(代......
  • Kubernetes修改Pod数量
    修改kubeletpod数量并在启动命令尾部添加变量$KUBELET_NODE_MAX_PODS如下:重启kubelet:[root@k8s02~]#systemctldaemon-reload&&systemctlrestartkubelet检查结果:[root@k8s02~]#kubectldescribenodek8s02|greppodspods:150pods:......
  • .NET(C#) 设计模式
    .NET(C#)设计模式简介设计模式(Designpattern)是代码设计经验的总结。设计模式主要分三个类型:创建型、结构型和行为型。创建型是对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。结构型是把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对......