在.NET 6中使用Serilog收集日志

此示例的完整详细信息:https://download.csdn.net/download/hefeng_aspnet/89998498  

        Serilog  是一个日志库,它提供对文件、控制台和其他几个地方的记录。它易于配置,并且具有干净且易于使用的界面。

        Serilog具有无与伦比的输出目的地选择(称为Sinks)以及丰富、路由、过滤和格式化结构化日志事件的能力,使其在任何应用程序中都不可或缺。

        在本文中,我们将学习如何在 .NET 6.0 中配置和使用 Serilog,遵循保持代码整洁和高性能的最佳实践。

先决条件

Visual Studio 2022 (.NET 6.0)
Nuget包Serilog.AspNetCore,Serilog.Enrichers.CorrelationId,Serilog.Exceptions和Serilog.Sinks.Async

应用程序编程接口

 在API program.cs类 中,按照以下代码进行配置:

program.cs:

using Sample.Serilog.WebApi.Core.Extensions;
using Sample.Serilog.WebApi.Core.Middlewares;
using Serilog;

try
{
    var builder = WebApplication.CreateBuilder(args);
    SerilogExtension.AddSerilogApi(builder.Configuration);
    builder.Host.UseSerilog(Log.Logger);

    builder.Services.AddControllers();

    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();

    var app = builder.Build();

    app.UseMiddleware<ErrorHandlingMiddleware>();
    app.UseMiddleware<RequestSerilLogMiddleware>();

    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }

    app.MapControllers();

    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
    Log.Information("Server Shutting down...");
    Log.CloseAndFlush();
}

        最好在应用程序开始时配置Serilog并包含错误处理( try和catch)以收集和显示应用程序可能生成的任何异常。

        builder.Host.UseSerilog(Log.Logger)代码负责将Serilog注册为应用程序的默认提供程序,因此也可以使用ILogger接口来注册应用程序的日志。

AddSerilogApi ()扩展包含以下代码:

SerilogExtension.cs:

namespace Sample.Serilog.WebApi.Core.Extensions;

public static class SerilogExtension
{
    public static void AddSerilogApi(IConfiguration configuration)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .Enrich.WithExceptionDetails()
            .Enrich.WithCorrelationId()
            .Enrich.WithProperty("ApplicationName", $"API Serilog - {Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}")
            .Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.StaticFiles"))
            .Filter.ByExcluding(z => z.MessageTemplate.Text.Contains("Business error"))
            .WriteTo.Async(wt => wt.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}"))
            .CreateLogger();
    }
}

其中我们有以下描述:

1、MaximumLevel.Override:配置给定命名空间的最小日志记录。
2、Enrich.FromLogContext: Serilog主要工作上下文。几乎在所有情况下您都需要记录此代码片段才能获得日志记录提供程序的好处。
3、Enrich.WithExceptionDetails:发生错误时,收集并记录所有异常详细信息。
4、Enrich.WithCorrelationId:关联所有日志记录,方便追踪。
5、Enrich.WithProperty:向日志添加新的自定义属性。
6、Filter.ByExclusion:根据配置的Matching排除收集到的日志。
7、WriteTo.Async:异步执行所有操作(后台)。这是Serilog最重要的设置之一。

在app.UseMiddleware<ErrorHandlingMiddleware>()中,我们有以下代码:

提到的,该中间件用作全局错误处理。

app.UseMiddleware<RequestSerilLogMiddleware>()部分包含以下代码:

ErrorHandlingMiddleware.cs:

namespace Sample.Serilog.WebApi.Core.Middlewares;

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        Log.Error(exception, "Error");

        var code = HttpStatusCode.InternalServerError;

        var result = System.Text.Json.JsonSerializer.Serialize(new { error = exception?.Message });

        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }
}

正如这篇文章中提到的,该中间件用作全局错误处理。

app.UseMiddleware<RequestSerilLogMiddleware>()部分包含以下代码:

RequestSerilLogMiddleware.cs:

namespace Sample.Serilog.WebApi.Core.Middlewares;

public class RequestSerilLogMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSerilLogMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        using (LogContext.PushProperty("UserName", context?.User?.Identity?.Name ?? "anônimo"))
        {
            return _next.Invoke(context);
        }
    }
}

该中间件用于收集附加信息以丰富日志,在这种情况下,我们仅收集来自认可用户的信息。

最后使用以下代码配置控制器:

ClientController.cs:

namespace Sample.Serilog.WebApi.Controllers;

[ApiController]
[Route("[controller]")]
public class ClientController : ControllerBase
{
    private readonly ILogger<ClientController> _logger;

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

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        _logger.LogInformation("Endpoint Get successful. (from ILogger)");
        Log.Information("Endpoint Get successful. (from Serilog)");

        return Ok();
    }
}

在此示例中,我们以两种方式记录日志,一种使用ILogger ,另一种使用Serilog的名为Log的静态类。

测试

要进行测试,请  在 Swagger 中运行GET /client端点 并检查日志收集的结果,包括控制器中配置的两种形式,如下图所示:

        Serilog是所有 .NET 应用程序中一个出色且不可或缺的组件,使用您可以捕获所有应用程序日志,以便将来进行遥测分析以做出决策。使用WriteTo.Async配置,所有内容都会异步记录,这确保Serilog不会影响应用程序的性能。 

此示例的完整详细信息:https://download.csdn.net/download/hefeng_aspnet/89998498 

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…

【Spring Cloud】实现微服务调用的负载均衡

文章目录 什么是负载均衡自定义实现负载均衡启动shop-product微服务通过nacos查看微服务的启动情况自定义实现负载均衡 基于Ribbon实现负载均衡添加注解修改服务调用的方法Ribbon支持的负载均衡策略通过修改配置来调整 Ribbon 的负载均衡策略通过注入Bean来调整 Ribbon 的负载均…

AUTOSAR AP和CP的安全要求规范(Safety Req)详细解读

一、规范的编制的背景原因 编制该规范的原因 确保系统安全性和可靠性 随着汽车电子系统日益复杂&#xff0c;功能不断增加&#xff0c;对安全性和可靠性的要求也越来越高。该规范为AUTOSAR平台在安全执行、配置、更新、信息交换、数据处理等多方面制定了明确要求&#xff0c;…

Robot Framework的 if/else语句

一. 简介 在Robot Framework中&#xff0c;可以使用多个 IF/ELSE 条件来实现不同的测试逻辑。IF 语句用于在满足条件时执行特定的测试步骤&#xff0c;而 ELSE语句则用于在条件不满足时执行其他步骤。 本文来学习 Robot Framework 框架中 if/else 语句的语法以及使用。 二. …

Jenkins 的HTTP Request 插件为什么不能配置Basic认证了

本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级&#xff0c;升级策略是在一台新服务器上安装和配置最新版本的Jenkins&#xff0c; 当前的最新版本是&#xff1a; 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载&#xff0c;也可以到如下地址下载&#xff1…

【Linux课程学习】: 进程地址空间,小故事理解虚拟地址,野指针

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 Linux学习笔记&#xff1a; https://blog.csdn.net/…

位运算符I^~

&运算&#xff1a;上下相等才是1&#xff0c;有一个不同就是0 |运算&#xff1a;只要有1返回的就是1 ^(亦或)运算&#xff1a;上下不同是1&#xff0c;相同是0 ~运算&#xff1a;非运算&#xff0c;与数据全相反 cpu核心运算原理&#xff0c;四种cpu底层小电路 例&#xf…

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之&#xff1a;内存与垃圾回收篇&#xff08;一&#xff09; ##本篇内容概述&#xff1a; 1、JVM结构 2、类加载子系统 3、运行时数据区之&#xff1a;PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系&#xff0c;它只是与特…

美团一面,有点难度

前几天分享过一篇训练营的朋友在阿里的一面面经&#xff0c;挺简单的她也是很轻松的过了&#xff0c;感兴趣的可以看一下我之前发的文章。 今天要分享的还是她的面经&#xff0c;美团的一面&#xff0c;感觉比阿里的难一些&#xff0c;各位观众老爷你怎么看&#xff1f; 自我介…

spring6:2入门

spring6&#xff1a;2入门 目录 spring6&#xff1a;2入门2.1、环境要求2.2、构建模块2.3、程序开发2.3.1、引入依赖2.3.2、创建java类2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序分析2.5、启用Log4j2日志框架2.5.1、Log4j2日志概述2.5.2、引入Log…

03、Node.js安装及环境配置

1.下载node.js 下载地址&#xff1a;Node.js 2.安装 2.1 自定义安装路径&#xff08;可以选择默认&#xff09; 下图根据本身的需要进行&#xff0c;我选择了默认Node.js runtime&#xff0c;然后Next&#xff1a; Node.js runtime &#xff1a;表示运行环境 npm package mana…

容器镜像仓库

文章目录 1、docker hub1_注册2_登录3_创建容器镜像仓库4_在本地登录Docker Hub5_上传容器镜像6_下载容器镜像 2、harbor1_获取 docker compose二进制文件2_获取harbor安装文件3_获取TLS文件4_修改配置文件5_执行预备脚本6_执行安装脚本7_验证运行情况8_访问harborUI界面9_harb…

在paddle中安装python-bidi出错

翻看网上解决方式&#xff0c;是由于系统中缺少 Rust 及其包管理器 Cargo。python-bidi 依赖 Rust 来编译其扩展&#xff0c;如果没有安装 Rust 和 Cargo&#xff0c;安装过程将无法继续。 解决方式 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh但是我的终端…

buuctf:被嗅探的流量

解压后用wireshark查看 flag{da73d88936010da1eeeb36e945ec4b97}

Windows 11 文件管理器隐藏主文件夹、图库和OneDrive

Windows 11 文件管理器隐藏主文件夹、图库和OneDrive 注册表编辑器⌈ 主文件夹 ⌋⌈ 图库 ⌋⌈ OneDrive ⌋ 注册表编辑器 使用 Windows R 快捷键打开「运行」对话框&#xff0c;执行 regedit 打开注册表编辑器。 ⌈ 主文件夹 ⌋ 注册表路径 &#xff1a; 计算机\HKEY_LOCA…

数据结构与算法-03链表-04

链表与递归 在链表操作中移除、反转经常会用到递归实现。通过力扣案例理解链表常规操作中的递归实现。 移除数据 删除链表的节点 问题 LCR 136. 删除链表的节点 - 力扣&#xff08;LeetCode&#xff09; 问题描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定…

什么是敏捷(Agile)开发?Scrum和Kanban有什么关系?

最近面试过程中被问到和敏捷开发相关的内容&#xff0c;在产品实际工作中经常会涉及到敏捷开发&#xff0c;但其实我自己没有系列了解过敏捷开发&#xff0c;除了考PMP的时候接触了下&#xff0c;大多数都是在工作中实践积累的&#xff0c;太接地气&#xff0c;为了稍显理论知识…

OpenCV-平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…

容积卡尔曼滤波(CKF)仿真抛物线运动

容积卡尔曼滤波&#xff08;CKF&#xff09;仿真抛物线运动 容积卡尔曼滤波&#xff08;Cubature Kalman Filter, CKF&#xff09;的MATLAB实现。CKF是一种用于非线性系统状态估计的算法&#xff0c;它通过在状态空间中采样点&#xff08;容积点&#xff09;来近似非线性函数的…

leetcode:1995. 统计特殊四元组(python3解法)

难度&#xff1a;简单 给你一个 下标从 0 开始 的整数数组 nums &#xff0c;返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 &#xff1a; nums[a] nums[b] nums[c] nums[d] &#xff0c;且a < b < c < d 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3…