使用 Serilog 在 .NET Core 6.0 中日志记录

news2025/1/24 19:18:59

在本文中,我们将讨论日志记录的基础知识以及在 .NET Core 6 中使用 Serilog 的逐步实现。

先决条件

1、Visual Studio 2022。
2、C# 和 .NET Core 的基础知识。
3、.NET Core 6 SDK。 

日志记录基础知识

    从技术角度来说,日志记录是记录事件并捕获应用程序在运行过程中生成的其他信息的过程。它在软件开发的各个方面都发挥着至关重要的作用,包括:
    调试-Debugging :日志为排除错误和识别问题根源提供了有价值的信息。
    监控-Monitoring:日志有助于跟踪应用程序的健康状况、性能和用户活动。
    审计-Auditing:日志可用于保存特定操作和更改的记录,以达到安全性和合规性目的。

以下是日志记录基础知识的细分:

1. 日志条目:

每个日志条目通常包含以下内容:

    时间戳:表示事件发生的时间。
    日志级别:对事件的严重程度进行分类(例如,调试、信息、警告、错误、严重)。
    消息:详细描述事件。
    上下文信息:与事件相关的可选数据(例如,用户 ID、请求详细信息)。

2.日志级别:

大多数日志记录框架使用日志级别层次结构,允许您过滤和确定记录信息的优先级:

    调试:深度调试的详细信息(通常在生产中禁用)。
    信息:有关应用程序正常运行的信息消息。
    警告:可能表明存在潜在问题但不一定会导致错误的事件。
    错误:导致应用程序发生故障或遇到意外状态的事件。
    严重:需要立即关注的事件,可能会导致严重问题。

3. 日志目的地:

日志可以写入各种目的地以用于不同目的:

    文件:存储持久日志以供日后分析的常见选择。
    控制台:对于开发或故障排除期间的实时观察很有用。
    数据库:支持将日志与其他应用程序数据一起存储。
    网络套接字:允许将日志发送到集中式服务器进行汇总和分析。

4.选择日志框架:

大多数编程语言都有内置的日志库或流行的第三方选项。这些框架提供:

    结构化日志:将日志存储为键值对,以便于分析。
    灵活的 API:提供各种方法用于不同级别的记录和添加上下文。

.NET Core 中的 Serilog

    Serilog 是一个适用于 .NET 应用程序的现代结构化日志记录框架。它提供了一种灵活而强大的方法来捕获和存储日志数据,使开发人员能够轻松地排除故障、监控和分析应用程序行为。

Serilog 对 C# 开发人员有几个好处,包括:

    1、配置简单
    2、灵活的
    3、支持结构化日志记录

什么是 Serilog Sinks?

    Serilog 中的接收器是日志目标(即,它们是您想要发送日志的目的地)。一些流行的接收器是文件和控制台目标。Serilog 接收器是您的日志的目的地。这可以是文件、数据库、云服务等。

任何可以存储日志数据的东西都可以用作 Serilog 接收器。Serilog 附带许多内置接收器,但您也可以创建自己的自定义接收器。这样您就可以将日志数据发送到您想要的任何目的地。

步骤1:-

    在您的解决方案中安装Serilog.AspNetCore包。此包提供 Serilog 和 ASP.NET Core 之间必要的集成。

步骤2

    Serilog 的配置:在 ASP.NET Core 中配置 Serilog 主要有两种方法:

a)使用appsettings.json

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "path": "logs/log.txt",
          "rollingInterval": "Day"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ],
    "Properties": {
      "Application": "WeatherForecast"
    }
  }
}

解释:

Using:在本节中,我们需要指定要使用的接收器类型。(例如:控制台和文件)
Minimum Level:通过此部分,我们可以设置最低日志级别和信息级别。
WriteTo:在此部分中,我们可以配置接收器。在此示例中,我们同时使用控制台和文件来写入日志,并进行了一些额外的配置。
Enrich:使用此部分,我们可以为日志事件添加额外的上下文。
Properties:允许我们向日志事件添加自定义属性。

b) 在 Program.cs 中使用 Lambda 表达式

    注意:-(简单来说,当您注入 Serilog 服务时)

public static async Task Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    builder.Host.UseSerilog((context, config) =>
    {
        config.MinimumLevel.Information()
              .WriteTo.Console()
              .WriteTo.File("log.txt");
    });

    // Rest of your application configuration code...
}

        此方法使用 lambda 表达式来明确配置 Serilog。它将最低日志级别设置为“信息”,并将日志写入控制台和名为“log.txt”的文件。

步骤3

使用应用程序设置配置注册所需的 Serilog 服务并在管道中添加中间件。

    注意:-(如果您使用 Lambda 表达式配置 Serilog,请省略此步骤,因为这两者都会在该步骤中出现)

// Add namespace
using Serilog;

// Add serilog services to the container and read config from appsettings
builder.Host.UseSerilog((context, configuration) =>
    configuration.ReadFrom.Configuration(context.Configuration));

// Configure Serilog for logging (middleware)
app.UseSerilogRequestLogging();

步骤4

配置 Serilog 后,您可以将ILogger<T>接口注入到您的类中并使用其方法来记录消息:

    注意:- 您也可以使用 Serilog 的方法。我使用的是默认的 ILogger 接口。

public class MyService
{
    private readonly ILogger<MyService> _logger;

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

    public void DoSomething()
    {
        _logger.Information("Starting operation...");
        // Your code goes here
        _logger.Debug("Operation completed successfully.");
    }
}

T用您的类别的类型进行替换以获取特定于该类别的记录器。

根据事件的严重性和日志消息详细信息调用适当的日志记录方法(Debug、Information、Warning、Error等)。  

附加信息:-

"WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "Logs/.txt",
          "rollOnFileSizeLimit": true,
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter,Serilog.Formatting.Compact",
          "rollingInterval": "Day",
          "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Properties}{Exception}"
        }
      }

我们可以添加一些额外的配置,例如:-

rollOnFileSizeLimit是Serilog.Sinks.File接收器中使用的配置选项,用于根据日志文件的大小控制滚动日志文件的行为。以下是其功能的细分:(默认值rollOnFileSizeLimit通常为 1 GB(1073741824 字节)。

    1、防止日志文件无限增长,可能导致性能问题或磁盘空间耗尽。
    2、一旦当前日志文件达到指定的大小限制:
    3、Serilog 会自动创建一个带有递增后缀的新日志文件(例如“log.txt”、“log_00001.txt”、“log_00002.txt”等等)。

rollingInterval是一个选项,定义日志文件滚动的频率(关闭并创建一个新的文件)。

    该间隔可以设置为不同的单位,如Hour、Minute、Day等等。

formatter是一个关键组件,它定义如何将日志事件转换为人类可读或机器可读的格式以供存储或显示。Serilog 提供各种内置格式化程序,并支持创建自定义格式化程序以满足您的特定需求。

JsonFormatter

CompactJsonFormatter

RenderedCompactJsonFormatter

Literate Formatter

Exception Formatter

outputTemplate是一个强大的配置选项,可让您定义日志消息的确切结构和内容。它本质上是一个字符串格式模板,类似于字符串插值中使用的模板,但专门针对 Serilog 量身定制。

占位符:

    1、@{propertyName}:指日志事件中定义的特定属性。
    2、内置属性:无需使用@符号即可使用(例如,Timestamp,Level,Message,Exception)。
    3、自定义属性:使用类似方法添加到您的日志事件中Log.Information("Processed {Count} items", count)。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当 Facebook 窥探隐私:用户的数字权利如何捍卫?

随着社交平台的普及&#xff0c;Facebook 已经成为全球用户日常生活的一部分。然而&#xff0c;伴随而来的隐私问题也愈发严峻。近年来&#xff0c;Facebook 频频被曝出泄露用户数据、滥用个人信息等事件&#xff0c;令公众对其隐私保护措施产生质疑。在这个信息化时代&#xf…

微信小程序隐藏右侧胶囊按钮,分享和关闭即右侧三个点和小圆圈按钮

在微信小程序开发过程中&#xff0c;可能需要将右侧的胶囊按钮、即右侧的三个点和小圆圈按钮关闭掉。如图&#xff1a; 这时&#xff0c;我们只需在该页面的json文件中进行相关配置即可 {"navigationBarTitleText": "商品详情页","navigationStyle&q…

Sharding-JDBC 5.4.1+SpringBoot3.4.1+MySQL8.4.1 使用案例

最近在升级 SpringBoot 项目&#xff0c;原版本是 2.7.16&#xff0c;要升级到 3.4.0 &#xff0c;JDK 版本要从 JDK8 升级 JDK21&#xff0c;原项目中使用了 Sharding-JDBC&#xff0c;版本 4.0.0-RC1&#xff0c;在升级 SpringBoot 版本到 3.4.0 之后&#xff0c;服务启动失败…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…

【数据库】详解MySQL数据库中索引的本质与底层原理

目录 1.MySQL索引的本质 1.1.索引的重要性 1.2.索引演示 1.3.索引的底层原理 1.3.1磁盘IO的原理 1.3.2.硬盘的主要结构 1.3.3.工作情形 1.3.4.各主要部件说明 1.3.5.扇区中是如何表示01数据的 2.MySQL索引底层原理 2.1.二叉查找树 2.2.平衡二叉查找树 2.3.B树和B树…

网络编程原理:回显服务器与客户端通信交互功能

文章目录 路由器及网络概念网络通信基础TCP/IP 五层协议封装和分用封装分用 网络编程&#xff08;网络协议&#xff09;UDP类 API使用实现回显通信程序回显服务器(UDP代码)回显客户端(UDP代码) TCP API使用回显服务器(TCP代码)回显客户端(TCP代码) 路由器及网络概念 网络发展是…

AIGC视频扩散模型新星:Video 版本的SD模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓&#xff0c;而慕尼黑大学同样不容小觑&#xff0c;…

[Day 15]54.螺旋矩阵(简单易懂 有画图)

今天我们来看这道螺旋矩阵&#xff0c;和昨天发的题很类似。没有技巧&#xff0c;全是循环。小白也能懂~ 力扣54.螺旋矩阵 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; …

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…

QT QTreeWidget控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

掌握Spring事务隔离级别,提升并发处理能力

Spring框架支持的事务隔离级别与标准的JDBC隔离级别保持一致&#xff0c;共包括五大隔离级别&#xff0c;它们分别是&#xff1a;DEFAULT&#xff08;默认隔离级别&#xff09;、READ_UNCOMMITTED&#xff08;读未提交&#xff09;、READ_COMMITTED&#xff08;读已提交&#x…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

Git知识分享

一、理解git首先要理清楚下面五个概念&#xff1a; 1、工作区(git add 命令之前的样子) 2、stash 暂存(暂存工作区和暂存区的更改) 3、暂存区(git add 命令之后的存储区, 4、本地仓库(git commit提交的位置) 5、远程仓库(git push提交的位置) 二、git常用命令&#xff1a; 1、g…

【2024 - 年终总结】叶子增长,期待花开

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论博客创作保持2024的记录清单博客科研开源工作生活 总结与展望互动致谢参考 前言…

分类问题(二元,多元逻辑回归,费歇尔判别分析)spss实操

分类模型&#xff1a; 二分类和多分类&#xff1a; 对于二分类模型 &#xff0c;我们将介绍逻辑回归和Fisher线性判别分析两种分类算法; 对于多分类模型&#xff0c;我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤 二分类: 基于广义线性模型&#x…

k8s使用nfs持久卷

开启持久化卷后可以实现服务开启在不同节点也能读取到和拿到服务节点的文件。 基本流程为将集群中一个节点作为服务节点安装共享储存应用的服务端选择目录和开启端口&#xff0c;其他节点根据端口挂载目录。然后使用kubesphere选择相应的镜像并将端口信息和挂载目录信息作为参…

kalman滤波器C++设计仿真案例

很多同学看了我之前的文章&#xff0c;都对kalman滤波器的原理有了理解&#xff0c;但我发现&#xff0c;在具体工程设计过程中&#xff0c;还是很多人都感觉到无从下手&#xff0c;一些参数也不知道如何选取。 这样吧。我这里举一些简单的例子&#xff0c;并用C来一步一步的进…

2025.1.21——六、BUU XSS COURSE 1 XSS漏洞|XSS平台搭建

题目来源&#xff1a;buuctf BUU XSS COURSE 1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;输入框尝试一下 step 2&#xff1a;开始xss注入 step 3&#xff1a;搭建平台 step 4&#xff1a;利用管理员cookie访问地址 三、小结 二编&#…

微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。

1&#xff0c;可能是原因是你使用了scroll-view的标签&#xff0c;用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此&#xff0c;你使用overflow:auto.来使用页面的某些元素滚动&#xf…

Linux-arm(1)ATF启动流程

Linux-arm(1)ATF启动流量 Author&#xff1a;Once Day Date&#xff1a;2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档&#xff1a; ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…